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 6a2732d2e15cd60a61155c14f0dc5918bbefc369..01786493748a967f9901b206245d2bb5879f05c0 100644 |
--- a/base/task_scheduler/task_scheduler_impl.cc |
+++ b/base/task_scheduler/task_scheduler_impl.cc |
@@ -58,59 +58,15 @@ size_t GetEnvironmentIndexForTraits(const TaskTraits& traits) { |
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, |
- const WorkerPoolIndexForTraitsCallback& |
- worker_pool_index_for_traits_callback) { |
- std::unique_ptr<TaskSchedulerImpl> scheduler( |
- new TaskSchedulerImpl(worker_pool_index_for_traits_callback)); |
- scheduler->Initialize(worker_pool_params_vector); |
- 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)); |
+ auto task_scheduler = WrapUnique(new TaskSchedulerImpl(name)); |
+ task_scheduler->Initialize(init_params); |
+ return task_scheduler; |
} |
TaskSchedulerImpl::~TaskSchedulerImpl() { |
@@ -145,15 +101,21 @@ TaskSchedulerImpl::CreateSequencedTaskRunnerWithTraits( |
scoped_refptr<SingleThreadTaskRunner> |
TaskSchedulerImpl::CreateSingleThreadTaskRunnerWithTraits( |
const TaskTraits& traits) { |
+ const auto& environment_params = |
+ kEnvironmentParams[GetEnvironmentIndexForTraits(traits)]; |
return single_thread_task_runner_manager_ |
- ->CreateSingleThreadTaskRunnerWithTraits(traits); |
+ ->CreateSingleThreadTaskRunnerWithTraits( |
+ name_ + environment_params.name_suffix, |
+ environment_params.priority_hint, traits); |
} |
#if defined(OS_WIN) |
scoped_refptr<SingleThreadTaskRunner> |
TaskSchedulerImpl::CreateCOMSTATaskRunnerWithTraits(const TaskTraits& traits) { |
+ const auto& environment_params = |
+ kEnvironmentParams[GetEnvironmentIndexForTraits(traits)]; |
return single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( |
- traits); |
+ environment_params.name_suffix, environment_params.priority_hint, traits); |
} |
#endif // defined(OS_WIN) |
@@ -196,18 +158,11 @@ void TaskSchedulerImpl::JoinForTesting() { |
#endif |
} |
-TaskSchedulerImpl::TaskSchedulerImpl(const WorkerPoolIndexForTraitsCallback& |
- worker_pool_index_for_traits_callback) |
- : service_thread_("TaskSchedulerServiceThread"), |
- worker_pool_index_for_traits_callback_( |
- worker_pool_index_for_traits_callback) { |
- DCHECK(!worker_pool_index_for_traits_callback_.is_null()); |
-} |
+TaskSchedulerImpl::TaskSchedulerImpl(const std::string& name) |
+ : name_(name), service_thread_("TaskSchedulerServiceThread") {} |
void TaskSchedulerImpl::Initialize( |
- const std::vector<SchedulerWorkerPoolParams>& worker_pool_params_vector) { |
- DCHECK(!worker_pool_params_vector.empty()); |
- |
+ const TaskScheduler::InitParams& init_params) { |
// Start the service thread. On platforms that support it (POSIX except NaCL |
// SFI), the service thread runs a MessageLoopForIO which is used to support |
// FileDescriptorWatcher in the scope in which tasks run. |
@@ -238,7 +193,6 @@ void TaskSchedulerImpl::Initialize( |
single_thread_task_runner_manager_ = |
MakeUnique<SchedulerSingleThreadTaskRunnerManager>( |
- worker_pool_params_vector, worker_pool_index_for_traits_callback_, |
task_tracker_.get(), delayed_task_manager_.get()); |
single_thread_task_runner_manager_->Start(); |
@@ -248,24 +202,41 @@ void TaskSchedulerImpl::Initialize( |
re_enqueue_sequence_callback = |
Bind(&TaskSchedulerImpl::ReEnqueueSequenceCallback, Unretained(this)); |
+ // Order must match the EnvironmentType enum. |
+ const SchedulerWorkerPoolParams* worker_pool_params[] = { |
+ &init_params.background_worker_pool_params, |
+ &init_params.background_blocking_worker_pool_params, |
+ &init_params.foreground_worker_pool_params, |
+ &init_params.foreground_blocking_worker_pool_params}; |
+ |
+ static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT, |
+ "The size of |worker_pools_| must match ENVIRONMENT_COUNT."); |
+ static_assert( |
+ arraysize(kEnvironmentParams) == ENVIRONMENT_COUNT, |
+ "The size of |kEnvironmentParams| must match ENVIRONMENT_COUNT."); |
+ static_assert( |
+ arraysize(worker_pool_params) == ENVIRONMENT_COUNT, |
+ "The size of |worker_pool_params| must match ENVIRONMENT_COUNT."); |
+ |
// Start worker pools. |
- for (const auto& worker_pool_params : worker_pool_params_vector) { |
- // Passing pointers to objects owned by |this| to |
- // SchedulerWorkerPoolImpl::Create() is safe because a TaskSchedulerImpl |
- // can't be deleted before all its worker pools have been joined. |
- worker_pools_.push_back(MakeUnique<SchedulerWorkerPoolImpl>( |
- worker_pool_params.name(), worker_pool_params.priority_hint(), |
+ for (int environment_type = 0; environment_type < ENVIRONMENT_COUNT; |
+ ++environment_type) { |
+ // Passing pointers to objects owned by |this| to the constructor of |
+ // SchedulerWorkerPoolImpl is safe because a TaskSchedulerImpl can't be |
+ // deleted before all its worker pools have been joined. |
+ worker_pools_[environment_type] = MakeUnique<SchedulerWorkerPoolImpl>( |
+ name_ + kEnvironmentParams[environment_type].name_suffix, |
+ kEnvironmentParams[environment_type].priority_hint, |
re_enqueue_sequence_callback, task_tracker_.get(), |
- delayed_task_manager_.get())); |
- worker_pools_.back()->Start(worker_pool_params); |
+ delayed_task_manager_.get()); |
+ worker_pools_[environment_type]->Start( |
+ *worker_pool_params[environment_type]); |
} |
} |
SchedulerWorkerPoolImpl* TaskSchedulerImpl::GetWorkerPoolForTraits( |
const TaskTraits& traits) const { |
- const size_t index = worker_pool_index_for_traits_callback_.Run(traits); |
- DCHECK_LT(index, worker_pools_.size()); |
- return worker_pools_[index].get(); |
+ return worker_pools_[GetEnvironmentIndexForTraits(traits)].get(); |
} |
void TaskSchedulerImpl::ReEnqueueSequenceCallback( |