| Index: base/task_scheduler/scheduler_worker_pool_impl.cc
|
| diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc
|
| index f15cc937c7122d62b05335de9644c38ee907be50..f2d69344f4cfb6da35f4932b6ad3aa4ba0d7d739 100644
|
| --- a/base/task_scheduler/scheduler_worker_pool_impl.cc
|
| +++ b/base/task_scheduler/scheduler_worker_pool_impl.cc
|
| @@ -313,8 +313,9 @@ std::unique_ptr<SchedulerWorkerPoolImpl> SchedulerWorkerPoolImpl::Create(
|
| params.io_restriction(),
|
| params.suggested_reclaim_time(),
|
| task_tracker, delayed_task_manager));
|
| - if (worker_pool->Initialize(params.priority_hint(), params.max_threads(),
|
| - re_enqueue_sequence_callback)) {
|
| + if (worker_pool->Initialize(
|
| + params.priority_hint(), params.standby_thread_policy(),
|
| + params.max_threads(), re_enqueue_sequence_callback)) {
|
| return worker_pool;
|
| }
|
| return nullptr;
|
| @@ -452,6 +453,15 @@ void SchedulerWorkerPoolImpl::DisallowWorkerDetachmentForTesting() {
|
| worker_detachment_disallowed_.Set();
|
| }
|
|
|
| +size_t SchedulerWorkerPoolImpl::NumberOfAliveWorkersForTesting() {
|
| + size_t num_alive_workers = 0;
|
| + for (const auto& worker : workers_) {
|
| + if (worker->ThreadAliveForTesting())
|
| + ++num_alive_workers;
|
| + }
|
| + return num_alive_workers;
|
| +}
|
| +
|
| SchedulerWorkerPoolImpl::SchedulerSingleThreadTaskRunner::
|
| SchedulerSingleThreadTaskRunner(const TaskTraits& traits,
|
| SchedulerWorkerPool* worker_pool,
|
| @@ -716,6 +726,7 @@ SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl(
|
|
|
| bool SchedulerWorkerPoolImpl::Initialize(
|
| ThreadPriority priority_hint,
|
| + SchedulerWorkerPoolParams::StandbyThreadPolicy standby_thread_policy,
|
| size_t max_threads,
|
| const ReEnqueueSequenceCallback& re_enqueue_sequence_callback) {
|
| AutoSchedulerLock auto_lock(idle_workers_stack_lock_);
|
| @@ -727,9 +738,13 @@ bool SchedulerWorkerPoolImpl::Initialize(
|
| // This ensures that they are woken up in order of index and that the ALIVE
|
| // worker is on top of the stack.
|
| for (int index = max_threads - 1; index >= 0; --index) {
|
| + const bool is_standby_lazy =
|
| + standby_thread_policy ==
|
| + SchedulerWorkerPoolParams::StandbyThreadPolicy::LAZY;
|
| const SchedulerWorker::InitialState initial_state =
|
| - (index == 0) ? SchedulerWorker::InitialState::ALIVE
|
| - : SchedulerWorker::InitialState::DETACHED;
|
| + (index == 0 && !is_standby_lazy)
|
| + ? SchedulerWorker::InitialState::ALIVE
|
| + : SchedulerWorker::InitialState::DETACHED;
|
| std::unique_ptr<SchedulerWorker> worker = SchedulerWorker::Create(
|
| priority_hint,
|
| MakeUnique<SchedulerWorkerDelegateImpl>(
|
| @@ -752,6 +767,8 @@ void SchedulerWorkerPoolImpl::WakeUpWorker(SchedulerWorker* worker) {
|
| DCHECK(worker);
|
| RemoveFromIdleWorkersStack(worker);
|
| worker->WakeUp();
|
| + // TOOD(robliao): Honor StandbyThreadPolicy::ONE here and consider adding
|
| + // hysteresis to the CanDetach check. See https://crbug.com/666041.
|
| }
|
|
|
| void SchedulerWorkerPoolImpl::WakeUpOneWorker() {
|
|
|