| Index: base/task_scheduler/scheduler_worker_thread.cc
|
| diff --git a/base/task_scheduler/scheduler_worker_thread.cc b/base/task_scheduler/scheduler_worker_thread.cc
|
| index 3565bd5e6b9f816cb1cf1d33074aea606e2255e0..54169499c2e173927495e0742328d96b928e5788 100644
|
| --- a/base/task_scheduler/scheduler_worker_thread.cc
|
| +++ b/base/task_scheduler/scheduler_worker_thread.cc
|
| @@ -28,14 +28,24 @@ LazyInstance<ThreadLocalPointer<const SchedulerTaskExecutor>>::Leaky
|
| // A task runner that runs tasks on a single SchedulerWorkerThread.
|
| class SchedulerSingleThreadTaskRunner : public SingleThreadTaskRunner {
|
| public:
|
| - SchedulerSingleThreadTaskRunner(const TaskTraits& traits,
|
| - SchedulerTaskExecutor* executor,
|
| - TaskTracker* task_tracker,
|
| - DelayedTaskManager* delayed_task_manager)
|
| + SchedulerSingleThreadTaskRunner(
|
| + const TaskTraits& traits,
|
| + SchedulerTaskExecutor* executor,
|
| + TaskTracker* task_tracker,
|
| + DelayedTaskManager* delayed_task_manager,
|
| + base::subtle::Atomic32* num_single_thread_task_runners)
|
| : traits_(traits),
|
| executor_(executor),
|
| task_tracker_(task_tracker),
|
| - delayed_task_manager_(delayed_task_manager) {}
|
| + delayed_task_manager_(delayed_task_manager),
|
| + num_single_thread_task_runners_(num_single_thread_task_runners) {
|
| + DCHECK(executor_);
|
| + DCHECK(task_tracker_);
|
| + DCHECK(delayed_task_manager_);
|
| + DCHECK(num_single_thread_task_runners_);
|
| +
|
| + base::subtle::NoBarrier_AtomicIncrement(num_single_thread_task_runners_, 1);
|
| + }
|
|
|
| // SingleThreadTaskRunner:
|
| bool PostDelayedTask(const tracked_objects::Location& from_here,
|
| @@ -58,7 +68,10 @@ class SchedulerSingleThreadTaskRunner : public SingleThreadTaskRunner {
|
| }
|
|
|
| private:
|
| - ~SchedulerSingleThreadTaskRunner() override = default;
|
| + ~SchedulerSingleThreadTaskRunner() override {
|
| + base::subtle::NoBarrier_AtomicIncrement(num_single_thread_task_runners_,
|
| + -1);
|
| + }
|
|
|
| // Sequence for all Tasks posted through this TaskRunner.
|
| const scoped_refptr<Sequence> sequence_ = new Sequence;
|
| @@ -68,6 +81,10 @@ class SchedulerSingleThreadTaskRunner : public SingleThreadTaskRunner {
|
| TaskTracker* const task_tracker_;
|
| DelayedTaskManager* const delayed_task_manager_;
|
|
|
| + // Number of single-thread TaskRunners associated with |executor_|.
|
| + // Incremented by the constructor and decremented by the destructor.
|
| + base::subtle::Atomic32* const num_single_thread_task_runners_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner);
|
| };
|
|
|
| @@ -97,7 +114,12 @@ SchedulerWorkerThread::~SchedulerWorkerThread() {
|
| scoped_refptr<SingleThreadTaskRunner>
|
| SchedulerWorkerThread::CreateTaskRunnerWithTraits(const TaskTraits& traits) {
|
| return make_scoped_refptr(new SchedulerSingleThreadTaskRunner(
|
| - traits, this, task_tracker_, delayed_task_manager_));
|
| + traits, this, task_tracker_, delayed_task_manager_,
|
| + &num_single_thread_task_runners_));
|
| +}
|
| +
|
| +size_t SchedulerWorkerThread::GetNumSingleThreadTaskRunners() const {
|
| + return base::subtle::NoBarrier_Load(&num_single_thread_task_runners_);
|
| }
|
|
|
| void SchedulerWorkerThread::WakeUp() {
|
| @@ -144,6 +166,8 @@ SchedulerWorkerThread::SchedulerWorkerThread(
|
| DCHECK(delayed_task_manager_);
|
| DCHECK(predecessor_priority_queue);
|
|
|
| + base::subtle::NoBarrier_Store(&num_single_thread_task_runners_, 0);
|
| +
|
| const size_t kDefaultStackSize = 0;
|
| PlatformThread::CreateWithPriority(kDefaultStackSize, this, &thread_handle_,
|
| thread_priority);
|
|
|