// Copyright 2016 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_TASK_TASK_TRAITS_H_ #define BASE_TASK_TASK_TRAITS_H_ #include <stdint.h> #include <iosfwd> #include <tuple> #include <type_traits> #include <utility> #include "base/base_export.h" #include "base/check.h" #include "base/check_op.h" #include "base/traits_bag.h" #include "build/build_config.h" namespace base { // Valid priorities supported by the task scheduling infrastructure. // // Note: internal algorithms depend on priorities being expressed as a // continuous zero-based list from lowest to highest priority. Users of this API // shouldn't otherwise care about nor use the underlying values. // // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.task enum class TaskPriority : uint8_t { … }; // Valid shutdown behaviors supported by the thread pool. enum class TaskShutdownBehavior : uint8_t { … }; // Determines at which thread priority a task may run. // // ThreadPolicy and priority updates // --------------------------------- // // If the TaskPriority of an UpdateableSequencedTaskRunner is increased while // one of its tasks is running at background thread priority, the task's // execution will have to complete at background thread priority (may take a // long time) before the next task can be scheduled with the new TaskPriority. // If it is important that priority increases take effect quickly, // MUST_USE_FOREGROUND should be used to prevent the tasks from running at // background thread priority. If it is important to minimize impact on the // rest on the system when the TaskPriority is BEST_EFFORT, PREFER_BACKGROUND // should be used. // // ThreadPolicy and priority inversions // ------------------------------------ // // A priority inversion occurs when a task running at background thread // priority is descheduled while holding a resource needed by a thread of // higher priority. MUST_USE_FOREGROUND can be combined with BEST_EFFORT to // indicate that a task has a low priority, but shouldn't run at background // thread priority in order to avoid priority inversions. Please consult with // //base/task/OWNERS if you suspect a priority inversion. enum class ThreadPolicy : uint8_t { … }; // Tasks with this trait may block. This includes but is not limited to tasks // that wait on synchronous file I/O operations: read or write a file from disk, // interact with a pipe or a socket, rename or delete a file, enumerate files in // a directory, etc. This trait isn't required for the mere use of locks. For // tasks that block on base/ synchronization primitives, see the // WithBaseSyncPrimitives trait. struct MayBlock { … }; // DEPRECATED. Use base::ScopedAllowBaseSyncPrimitives(ForTesting) instead. // // Tasks with this trait will pass base::AssertBaseSyncPrimitivesAllowed(), i.e. // will be allowed on the following methods : // - base::WaitableEvent::Wait // - base::ConditionVariable::Wait // - base::PlatformThread::Join // - base::PlatformThread::Sleep // - base::Process::WaitForExit // - base::Process::WaitForExitWithTimeout // // Tasks should generally not use these methods. // // Instead of waiting on a WaitableEvent or a ConditionVariable, put the work // that should happen after the wait in a callback and post that callback from // where the WaitableEvent or ConditionVariable would have been signaled. If // something needs to be scheduled after many tasks have executed, use // base::BarrierClosure. // // On Windows, join processes asynchronously using base::win::ObjectWatcher. // // MayBlock() must be specified in conjunction with this trait if and only if // removing usage of methods listed above in the labeled tasks would still // result in tasks that may block (per MayBlock()'s definition). // // In doubt, consult with //base/task/OWNERS. struct WithBaseSyncPrimitives { … }; // Describes metadata for a single task or a group of tasks. class BASE_EXPORT TaskTraits { … }; // Returns string literals for the enums defined in this file. These methods // should only be used for tracing and debugging. BASE_EXPORT const char* TaskPriorityToString(TaskPriority task_priority); BASE_EXPORT const char* TaskShutdownBehaviorToString( TaskShutdownBehavior task_priority); // Stream operators so that the enums defined in this file can be used in // DCHECK and EXPECT statements. BASE_EXPORT std::ostream& operator<<(std::ostream& os, const TaskPriority& shutdown_behavior); BASE_EXPORT std::ostream& operator<<( std::ostream& os, const TaskShutdownBehavior& shutdown_behavior); } // namespace base #endif // BASE_TASK_TASK_TRAITS_H_