MaintainAtLeastOneIdleWorkerLockRequired() is called from
WakeUpOneWorkerLockRequired(), which happens when posting a new task.
This causes creation of (idle) threads on the main thread, and potentially jank.
Here's a common stackframe causing jank:
base::`anonymous namespace'::CreateThreadInternal
base::internal::SchedulerWorker::Start(base::SchedulerWorkerObserver *)
base::internal::SchedulerWorkerPoolImpl::CreateRegisterAndStartSchedulerWorkerLockRequired()
base::internal::SchedulerWorkerPoolImpl::WakeUpOneWorkerLockRequired()
base::internal::SchedulerWorkerPoolImpl::OnCanScheduleSequence(scoped_refptr<base::internal::Sequence>)
base::internal::SchedulerWorkerPool::PostTaskWithSequenceNow(base::internal::Task,scoped_refptr<base::internal::Sequence>)
and a few traces:
76e57cff0d51fc1a (jank for 29.7 sec, ouch!)
442a59c740fc6047
2d1832505e43bb9d
2d1832505e43bb9d
72983fabaf55ff86
2f687934f93fdb97
An alternative is to move MaintainAtLeastOneIdleWorkerLockRequired() to GetWork(),
which is called from a SchedulerWorker and never from the main thread.
Comment 1 by etiennep@chromium.org
, Nov 16