// 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. #ifndef BASE_THREADING_SCOPED_THREAD_PRIORITY_H_ #define BASE_THREADING_SCOPED_THREAD_PRIORITY_H_ #include <atomic> #include <optional> #include "base/base_export.h" #include "base/compiler_specific.h" #include "base/location.h" #include "base/macros/uniquify.h" #include "base/memory/raw_ptr.h" #include "build/build_config.h" namespace base { class Location; enum class ThreadType : int; // All code that may load a DLL on a background thread must be surrounded by a // scope that starts with this macro. // // Example: // Foo(); // { // SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY(); // LoadMyDll(); // } // Bar(); // // The macro raises the thread priority to NORMAL for the scope if no other // thread has completed the current scope already (multiple threads can racily // begin the initialization and will all be boosted for it). On Windows, loading // a DLL on a background thread can lead to a priority inversion on the loader // lock and cause huge janks. #define SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY() … // Like SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY, but raises the thread // priority every time the scope is entered. Use this around code that may // conditionally load a DLL each time it is executed, or which repeatedly loads // and unloads DLLs. #define SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY_REPEATEDLY() … // Boosts the current thread's priority to match the priority of threads of // |target_thread_type| in this scope. class BASE_EXPORT ScopedBoostPriority { … }; namespace internal { class BASE_EXPORT ScopedMayLoadLibraryAtBackgroundPriority { … }; } // namespace internal } // namespace base #endif // BASE_THREADING_SCOPED_THREAD_PRIORITY_H_