| Index: base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
|
| diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
|
| index d4c26d6a404e04110ed0c38b35dbe7d798024208..e2ff1ef1058a49e61724b2bfdd211a1f7a7a1564 100644
|
| --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
|
| +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
|
| @@ -340,6 +340,22 @@ SchedulerSingleThreadTaskRunnerManager::
|
| #endif
|
| }
|
|
|
| +void SchedulerSingleThreadTaskRunnerManager::Start() {
|
| + decltype(workers_) workers_to_start;
|
| + {
|
| + AutoSchedulerLock auto_lock(lock_);
|
| + started_ = true;
|
| + workers_to_start = workers_;
|
| + }
|
| +
|
| + // Start workers that were created before this method was called. Other
|
| + // workers are started as they are created.
|
| + for (scoped_refptr<SchedulerWorker> worker : workers_to_start) {
|
| + worker->Start();
|
| + worker->WakeUp();
|
| + }
|
| +}
|
| +
|
| scoped_refptr<SingleThreadTaskRunner>
|
| SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits(
|
| const TaskTraits& traits) {
|
| @@ -359,7 +375,7 @@ SchedulerSingleThreadTaskRunnerManager::CreateCOMSTATaskRunnerWithTraits(
|
| void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() {
|
| decltype(workers_) local_workers;
|
| {
|
| - AutoSchedulerLock auto_lock(workers_lock_);
|
| + AutoSchedulerLock auto_lock(lock_);
|
| local_workers = std::move(workers_);
|
| }
|
|
|
| @@ -367,7 +383,7 @@ void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() {
|
| worker->JoinForTesting();
|
|
|
| {
|
| - AutoSchedulerLock auto_lock(workers_lock_);
|
| + AutoSchedulerLock auto_lock(lock_);
|
| DCHECK(workers_.empty())
|
| << "New worker(s) unexpectedly registered during join.";
|
| workers_ = std::move(local_workers);
|
| @@ -410,23 +426,33 @@ template <typename DelegateType>
|
| SchedulerWorker*
|
| SchedulerSingleThreadTaskRunnerManager::CreateAndRegisterSchedulerWorker(
|
| const SchedulerWorkerPoolParams& params) {
|
| - AutoSchedulerLock auto_lock(workers_lock_);
|
| - int id = next_worker_id_++;
|
| -
|
| - workers_.emplace_back(SchedulerWorker::Create(
|
| - params.priority_hint(),
|
| - CreateSchedulerWorkerDelegate<DelegateType>(params, id), task_tracker_,
|
| - SchedulerWorker::InitialState::DETACHED));
|
| - return workers_.back().get();
|
| + SchedulerWorker* worker;
|
| + bool start_worker;
|
| +
|
| + {
|
| + AutoSchedulerLock auto_lock(lock_);
|
| + int id = next_worker_id_++;
|
| + workers_.emplace_back(make_scoped_refptr(new SchedulerWorker(
|
| + params.priority_hint(),
|
| + CreateSchedulerWorkerDelegate<DelegateType>(params, id),
|
| + task_tracker_)));
|
| + worker = workers_.back().get();
|
| + start_worker = started_;
|
| + }
|
| +
|
| + if (start_worker)
|
| + worker->Start();
|
| +
|
| + return worker;
|
| }
|
|
|
| void SchedulerSingleThreadTaskRunnerManager::UnregisterSchedulerWorker(
|
| SchedulerWorker* worker) {
|
| // Cleanup uses a SchedulerLock, so call Cleanup() after releasing
|
| - // |workers_lock_|.
|
| + // |lock_|.
|
| scoped_refptr<SchedulerWorker> worker_to_destroy;
|
| {
|
| - AutoSchedulerLock auto_lock(workers_lock_);
|
| + AutoSchedulerLock auto_lock(lock_);
|
|
|
| // We might be joining, so record that a worker was unregistered for
|
| // verification at destruction.
|
|
|