Commit f287bd91 authored by Etienne Bergeron's avatar Etienne Bergeron Committed by Commit Bot

Modify ScopedThreadMayLoadLibraryOnBackgroundThread to change priority only once

This CL is changing the behavior of the
ScopedThreadMayLoadLibraryOnBackgroundThread which is used to change the
thread priority on a background thread when a library can be loaded.

The previous implementation was boosting the priority for the scope of
the class for each execution. This is overkill since the library is only loaded
once.

The proposition is to keep track of the executed program counters and
to avoid to boost priority twice.

R=gab@chromium.org, fdoray@chromium.org

Bug: 973868
Change-Id: I8c2e9e18ac7e2b922437132051eb6702f83cefaf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1775730Reviewed-by: default avatarEtienne Bergeron <etienneb@chromium.org>
Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Reviewed-by: default avatarGabriel Charette <gab@chromium.org>
Commit-Queue: Etienne Bergeron <etienneb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#691844}
parent ef1ba3eb
......@@ -4,12 +4,32 @@
#include "base/threading/scoped_thread_priority.h"
#include "base/containers/flat_set.h"
#include "base/location.h"
#include "base/no_destructor.h"
#include "base/synchronization/lock.h"
#include "base/threading/platform_thread.h"
#include "base/trace_event/trace_event.h"
namespace base {
namespace {
#if defined(OS_WIN)
// Flags the location |from_here| as executed. Returns true if the location
// was not previously executed.
bool ShouldBoostThreadPriorityForLocation(const Location& from_here) {
using ExecutedProgramCounterSet = base::flat_set<const void*>;
static base::NoDestructor<base::Lock> lock;
static base::NoDestructor<ExecutedProgramCounterSet> cache;
base::AutoLock auto_lock(*lock);
return cache.get()->insert(from_here.program_counter()).second;
}
#endif // OS_WIN
} // namespace
#if defined(OS_WIN)
// Enable the boost of thread priority when the code may load a library. The
// thread priority boost is required to avoid priority inversion on the loader
......@@ -28,6 +48,11 @@ ScopedThreadMayLoadLibraryOnBackgroundThread::
if (!base::FeatureList::IsEnabled(kBoostThreadPriorityOnLibraryLoading))
return;
// If the code at |from_here| has already been executed, do not boost the
// thread priority.
if (!ShouldBoostThreadPriorityForLocation(from_here))
return;
base::ThreadPriority priority = PlatformThread::GetCurrentThreadPriority();
if (priority == base::ThreadPriority::BACKGROUND) {
original_thread_priority_ = priority;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment