Index: base/task_scheduler/task_scheduler_impl.cc |
diff --git a/base/task_scheduler/task_scheduler_impl.cc b/base/task_scheduler/task_scheduler_impl.cc |
index e5c8abf716306f8602b0cde8786e10dc292f1739..cfeb539f0dd2a604a43f8fe57a75e28811580b3c 100644 |
--- a/base/task_scheduler/task_scheduler_impl.cc |
+++ b/base/task_scheduler/task_scheduler_impl.cc |
@@ -24,6 +24,57 @@ |
namespace base { |
namespace internal { |
+namespace { |
+ |
+enum EnvironmentType { |
+ BACKGROUND = 0, |
+ BACKGROUND_BLOCKING, |
+ FOREGROUND, |
+ FOREGROUND_BLOCKING, |
+ ENVIRONMENT_COUNT // Always last. |
+}; |
+ |
+// Order must match the EnvironmentType enum. |
+constexpr struct { |
+ // The threads and histograms of this environment will be labeled with |
+ // the task scheduler name concatenated to this. |
+ const char* name_suffix; |
+ |
+ // Preferred priority for threads in this environment; the actual thread |
+ // priority depends on shutdown state and platform capabilities. |
+ ThreadPriority priority_hint; |
+} kEnvironmentParams[] = { |
+ {"Background", base::ThreadPriority::BACKGROUND}, |
+ {"BackgroundBlocking", base::ThreadPriority::BACKGROUND}, |
+ {"Foreground", base::ThreadPriority::NORMAL}, |
+ {"ForegroundBlocking", base::ThreadPriority::NORMAL}, |
+}; |
+ |
+size_t GetEnvironmentIndexForTraits(const TaskTraits& traits) { |
+ const bool is_background = |
+ traits.priority() == base::TaskPriority::BACKGROUND; |
+ if (traits.may_block() || traits.with_base_sync_primitives()) |
+ return is_background ? BACKGROUND_BLOCKING : FOREGROUND_BLOCKING; |
+ return is_background ? BACKGROUND : FOREGROUND; |
+} |
+ |
+void AddAugmentedSchedulerWorkerPoolParamsToVector( |
+ EnvironmentType environment_type, |
+ const std::string& task_scheduler_name, |
+ const SchedulerWorkerPoolParams& params, |
+ std::vector<SchedulerWorkerPoolParams>* |
+ scheduler_worker_pool_params_vector) { |
+ DCHECK_EQ(static_cast<size_t>(environment_type), |
+ scheduler_worker_pool_params_vector->size()); |
+ scheduler_worker_pool_params_vector->emplace_back( |
+ task_scheduler_name + kEnvironmentParams[environment_type].name_suffix, |
+ kEnvironmentParams[environment_type].priority_hint, |
+ params.standby_thread_policy(), params.max_threads(), |
+ params.suggested_reclaim_time(), params.backward_compatibility()); |
+} |
+ |
+} // namespace |
+ |
// static |
std::unique_ptr<TaskSchedulerImpl> TaskSchedulerImpl::Create( |
const std::vector<SchedulerWorkerPoolParams>& worker_pool_params_vector, |
@@ -35,6 +86,33 @@ std::unique_ptr<TaskSchedulerImpl> TaskSchedulerImpl::Create( |
return scheduler; |
} |
+// static |
+std::unique_ptr<TaskSchedulerImpl> TaskSchedulerImpl::Create( |
+ const std::string& name, |
+ const TaskScheduler::InitParams& init_params) { |
+ // Create a vector of SchedulerWorkerPoolParams using names and priority hints |
+ // derived from |kEnvironmentParams| and other params from |init_params|. |
+ std::vector<SchedulerWorkerPoolParams> worker_pool_params_vector; |
+ AddAugmentedSchedulerWorkerPoolParamsToVector( |
+ BACKGROUND, name, init_params.background_worker_pool_params, |
+ &worker_pool_params_vector); |
+ AddAugmentedSchedulerWorkerPoolParamsToVector( |
+ BACKGROUND_BLOCKING, name, |
+ init_params.background_blocking_worker_pool_params, |
+ &worker_pool_params_vector); |
+ AddAugmentedSchedulerWorkerPoolParamsToVector( |
+ FOREGROUND, name, init_params.foreground_worker_pool_params, |
+ &worker_pool_params_vector); |
+ AddAugmentedSchedulerWorkerPoolParamsToVector( |
+ FOREGROUND_BLOCKING, name, |
+ init_params.foreground_blocking_worker_pool_params, |
+ &worker_pool_params_vector); |
+ DCHECK_EQ(static_cast<size_t>(ENVIRONMENT_COUNT), |
+ worker_pool_params_vector.size()); |
+ |
+ return Create(worker_pool_params_vector, Bind(&GetEnvironmentIndexForTraits)); |
+} |
+ |
TaskSchedulerImpl::~TaskSchedulerImpl() { |
#if DCHECK_IS_ON() |
DCHECK(join_for_testing_returned_.IsSet()); |