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 04117f213eda428e557cfd733693c38df0f65dc5..00ac91f922261a51b0fee496ff6f32fed6819025 100644 |
--- a/base/task_scheduler/scheduler_worker_thread.cc |
+++ b/base/task_scheduler/scheduler_worker_thread.cc |
@@ -31,14 +31,24 @@ class SchedulerSingleThreadTaskRunner : public SingleThreadTaskRunner { |
// Constructs a SchedulerSingleThreadTaskRunner which can be used to post |
// tasks so long as |executor| is alive. |
// TODO(robliao): Find a concrete way to manage |executor|'s memory. |
- 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, |
@@ -64,7 +74,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; |
@@ -74,6 +87,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); |
}; |
@@ -103,7 +120,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() { |
@@ -152,6 +174,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); |