| 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 c1431ad3c0aa3ea66f2cb57c773c4f487fdf9138..2f5b68f6a78f6328580d95302a8905805801659b 100644
|
| --- a/base/task_scheduler/task_scheduler_impl.cc
|
| +++ b/base/task_scheduler/task_scheduler_impl.cc
|
| @@ -10,7 +10,6 @@
|
| #include "base/bind_helpers.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/task_scheduler/scheduler_service_thread.h"
|
| -#include "base/task_scheduler/scheduler_worker_pool_impl.h"
|
| #include "base/task_scheduler/sequence_sort_key.h"
|
| #include "base/task_scheduler/task.h"
|
| #include "base/time/time.h"
|
| @@ -19,9 +18,13 @@ namespace base {
|
| namespace internal {
|
|
|
| // static
|
| -std::unique_ptr<TaskSchedulerImpl> TaskSchedulerImpl::Create() {
|
| - std::unique_ptr<TaskSchedulerImpl> scheduler(new TaskSchedulerImpl);
|
| - scheduler->Initialize();
|
| +std::unique_ptr<TaskSchedulerImpl> TaskSchedulerImpl::Create(
|
| + const std::vector<WorkerPoolCreationArgs>& worker_pools,
|
| + const WorkerPoolIndexForTraitsCallback&
|
| + worker_pool_index_for_traits_callback) {
|
| + std::unique_ptr<TaskSchedulerImpl> scheduler(
|
| + new TaskSchedulerImpl(worker_pool_index_for_traits_callback));
|
| + scheduler->Initialize(worker_pools);
|
| return scheduler;
|
| }
|
|
|
| @@ -57,63 +60,47 @@ void TaskSchedulerImpl::JoinForTesting() {
|
| #if DCHECK_IS_ON()
|
| DCHECK(!join_for_testing_returned_.IsSignaled());
|
| #endif
|
| - background_worker_pool_->JoinForTesting();
|
| - background_file_io_worker_pool_->JoinForTesting();
|
| - normal_worker_pool_->JoinForTesting();
|
| - normal_file_io_worker_pool_->JoinForTesting();
|
| + for (const auto& worker_pool : worker_pools_)
|
| + worker_pool->JoinForTesting();
|
| service_thread_->JoinForTesting();
|
| #if DCHECK_IS_ON()
|
| join_for_testing_returned_.Signal();
|
| #endif
|
| }
|
|
|
| -TaskSchedulerImpl::TaskSchedulerImpl()
|
| +TaskSchedulerImpl::TaskSchedulerImpl(const WorkerPoolIndexForTraitsCallback&
|
| + worker_pool_index_for_traits_callback)
|
| : delayed_task_manager_(
|
| - Bind(&TaskSchedulerImpl::OnDelayedRunTimeUpdated, Unretained(this)))
|
| + Bind(&TaskSchedulerImpl::OnDelayedRunTimeUpdated, Unretained(this))),
|
| + worker_pool_index_for_traits_callback_(
|
| + worker_pool_index_for_traits_callback)
|
| #if DCHECK_IS_ON()
|
| ,
|
| join_for_testing_returned_(WaitableEvent::ResetPolicy::MANUAL,
|
| WaitableEvent::InitialState::NOT_SIGNALED)
|
| #endif
|
| {
|
| + DCHECK(!worker_pool_index_for_traits_callback_.is_null());
|
| }
|
|
|
| -void TaskSchedulerImpl::Initialize() {
|
| - using IORestriction = SchedulerWorkerPoolImpl::IORestriction;
|
| +void TaskSchedulerImpl::Initialize(
|
| + const std::vector<WorkerPoolCreationArgs>& worker_pools) {
|
| + DCHECK(!worker_pools.empty());
|
|
|
| const SchedulerWorkerPoolImpl::ReEnqueueSequenceCallback
|
| re_enqueue_sequence_callback =
|
| Bind(&TaskSchedulerImpl::ReEnqueueSequenceCallback, Unretained(this));
|
|
|
| - // TODO(fdoray): Derive the number of threads per pool from hardware
|
| - // characteristics rather than using hard-coded constants.
|
| -
|
| - // 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.
|
| - background_worker_pool_ = SchedulerWorkerPoolImpl::Create(
|
| - "TaskSchedulerBackground", ThreadPriority::BACKGROUND, 1U,
|
| - IORestriction::DISALLOWED, re_enqueue_sequence_callback, &task_tracker_,
|
| - &delayed_task_manager_);
|
| - CHECK(background_worker_pool_);
|
| -
|
| - background_file_io_worker_pool_ = SchedulerWorkerPoolImpl::Create(
|
| - "TaskSchedulerBackgroundFileIO", ThreadPriority::BACKGROUND, 1U,
|
| - IORestriction::ALLOWED, re_enqueue_sequence_callback, &task_tracker_,
|
| - &delayed_task_manager_);
|
| - CHECK(background_file_io_worker_pool_);
|
| -
|
| - normal_worker_pool_ = SchedulerWorkerPoolImpl::Create(
|
| - "TaskSchedulerForeground", ThreadPriority::NORMAL, 4U,
|
| - IORestriction::DISALLOWED, re_enqueue_sequence_callback, &task_tracker_,
|
| - &delayed_task_manager_);
|
| - CHECK(normal_worker_pool_);
|
| -
|
| - normal_file_io_worker_pool_ = SchedulerWorkerPoolImpl::Create(
|
| - "TaskSchedulerForegroundFileIO", ThreadPriority::NORMAL, 12U,
|
| - IORestriction::ALLOWED, re_enqueue_sequence_callback, &task_tracker_,
|
| - &delayed_task_manager_);
|
| - CHECK(normal_file_io_worker_pool_);
|
| + for (const auto& worker_pool : worker_pools) {
|
| + // 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(SchedulerWorkerPoolImpl::Create(
|
| + worker_pool.name, worker_pool.thread_priority, worker_pool.max_threads,
|
| + worker_pool.io_restriction, re_enqueue_sequence_callback,
|
| + &task_tracker_, &delayed_task_manager_));
|
| + CHECK(worker_pools_.back());
|
| + }
|
|
|
| service_thread_ = SchedulerServiceThread::Create(&task_tracker_,
|
| &delayed_task_manager_);
|
| @@ -122,15 +109,9 @@ void TaskSchedulerImpl::Initialize() {
|
|
|
| SchedulerWorkerPool* TaskSchedulerImpl::GetWorkerPoolForTraits(
|
| const TaskTraits& traits) {
|
| - if (traits.with_file_io()) {
|
| - if (traits.priority() == TaskPriority::BACKGROUND)
|
| - return background_file_io_worker_pool_.get();
|
| - return normal_file_io_worker_pool_.get();
|
| - }
|
| -
|
| - if (traits.priority() == TaskPriority::BACKGROUND)
|
| - return background_worker_pool_.get();
|
| - return normal_worker_pool_.get();
|
| + const size_t index = worker_pool_index_for_traits_callback_.Run(traits);
|
| + DCHECK_LT(index, worker_pools_.size());
|
| + return worker_pools_[index].get();
|
| }
|
|
|
| void TaskSchedulerImpl::ReEnqueueSequenceCallback(
|
|
|