mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2025-02-26 20:03:26 +03:00
86 lines
2.9 KiB
C++
86 lines
2.9 KiB
C++
|
// Copyright 2019 The Chromium Authors
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
#include "base/threading/scoped_thread_priority.h"
|
||
|
|
||
|
#include "base/location.h"
|
||
|
#include "base/threading/platform_thread.h"
|
||
|
#include "base/trace_event/base_tracing.h"
|
||
|
#include "build/build_config.h"
|
||
|
|
||
|
namespace base {
|
||
|
|
||
|
ScopedBoostPriority::ScopedBoostPriority(ThreadType target_thread_type) {
|
||
|
DCHECK_LT(target_thread_type, ThreadType::kRealtimeAudio);
|
||
|
const ThreadType original_thread_type =
|
||
|
PlatformThread::GetCurrentThreadType();
|
||
|
const bool should_boost = original_thread_type < target_thread_type &&
|
||
|
PlatformThread::CanChangeThreadType(
|
||
|
original_thread_type, target_thread_type) &&
|
||
|
PlatformThread::CanChangeThreadType(
|
||
|
target_thread_type, original_thread_type);
|
||
|
if (should_boost) {
|
||
|
original_thread_type_.emplace(original_thread_type);
|
||
|
PlatformThread::SetCurrentThreadType(target_thread_type);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ScopedBoostPriority::~ScopedBoostPriority() {
|
||
|
if (original_thread_type_.has_value())
|
||
|
PlatformThread::SetCurrentThreadType(original_thread_type_.value());
|
||
|
}
|
||
|
|
||
|
namespace internal {
|
||
|
|
||
|
ScopedMayLoadLibraryAtBackgroundPriority::
|
||
|
ScopedMayLoadLibraryAtBackgroundPriority(const Location& from_here,
|
||
|
std::atomic_bool* already_loaded)
|
||
|
#if BUILDFLAG(IS_WIN)
|
||
|
: already_loaded_(already_loaded)
|
||
|
#endif // BUILDFLAG(IS_WIN)
|
||
|
{
|
||
|
TRACE_EVENT_BEGIN(
|
||
|
"base", "ScopedMayLoadLibraryAtBackgroundPriority",
|
||
|
[&](perfetto::EventContext ctx) {
|
||
|
ctx.event()->set_source_location_iid(
|
||
|
base::trace_event::InternedSourceLocation::Get(&ctx, from_here));
|
||
|
});
|
||
|
|
||
|
#if BUILDFLAG(IS_WIN)
|
||
|
if (already_loaded_ && already_loaded_->load(std::memory_order_relaxed))
|
||
|
return;
|
||
|
|
||
|
const base::ThreadType thread_type = PlatformThread::GetCurrentThreadType();
|
||
|
if (thread_type == base::ThreadType::kBackground) {
|
||
|
original_thread_type_ = thread_type;
|
||
|
PlatformThread::SetCurrentThreadType(base::ThreadType::kDefault);
|
||
|
|
||
|
TRACE_EVENT_BEGIN0(
|
||
|
"base",
|
||
|
"ScopedMayLoadLibraryAtBackgroundPriority : Priority Increased");
|
||
|
}
|
||
|
#endif // BUILDFLAG(IS_WIN)
|
||
|
}
|
||
|
|
||
|
ScopedMayLoadLibraryAtBackgroundPriority::
|
||
|
~ScopedMayLoadLibraryAtBackgroundPriority() {
|
||
|
// Trace events must be closed in reverse order of opening so that they nest
|
||
|
// correctly.
|
||
|
#if BUILDFLAG(IS_WIN)
|
||
|
if (original_thread_type_) {
|
||
|
TRACE_EVENT_END0(
|
||
|
"base",
|
||
|
"ScopedMayLoadLibraryAtBackgroundPriority : Priority Increased");
|
||
|
PlatformThread::SetCurrentThreadType(original_thread_type_.value());
|
||
|
}
|
||
|
|
||
|
if (already_loaded_)
|
||
|
already_loaded_->store(true, std::memory_order_relaxed);
|
||
|
#endif // BUILDFLAG(IS_WIN)
|
||
|
TRACE_EVENT_END0("base", "ScopedMayLoadLibraryAtBackgroundPriority");
|
||
|
}
|
||
|
|
||
|
} // namespace internal
|
||
|
} // namespace base
|