Index: base/task_scheduler/scheduler_thread_pool.cc |
diff --git a/base/task_scheduler/scheduler_thread_pool.cc b/base/task_scheduler/scheduler_thread_pool.cc |
index ca9161c2029915d47ed5dcd527ca78b1bddf36a1..7509567b514905085dbbaf4596e5e46554b57eab 100644 |
--- a/base/task_scheduler/scheduler_thread_pool.cc |
+++ b/base/task_scheduler/scheduler_thread_pool.cc |
@@ -11,6 +11,7 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
+#include "base/sequenced_task_runner.h" |
#include "base/task_scheduler/utils.h" |
#include "base/threading/thread_local.h" |
@@ -63,6 +64,51 @@ class SchedulerParallelTaskRunner : public TaskRunner { |
DISALLOW_COPY_AND_ASSIGN(SchedulerParallelTaskRunner); |
}; |
+// A task runner that runs tasks with the SEQUENCED ExecutionMode. |
+class SchedulerSequencedTaskRunner : public SequencedTaskRunner { |
+ public: |
+ SchedulerSequencedTaskRunner(const TaskTraits& traits, |
+ PriorityQueue* priority_queue, |
+ TaskTracker* task_tracker) |
+ : traits_(traits), |
+ priority_queue_(priority_queue), |
+ task_tracker_(task_tracker) {} |
+ |
+ // SequencedTaskRunner: |
+ bool PostDelayedTask(const tracked_objects::Location& from_here, |
+ const Closure& closure, |
+ TimeDelta delay) override { |
+ // TODO(fdoray): Support delayed tasks. |
+ DCHECK(delay.is_zero()); |
+ |
+ return PostTaskHelper(WrapUnique(new Task(from_here, closure, traits_)), |
+ sequence_, priority_queue_, task_tracker_); |
+ } |
+ |
+ bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
+ const Closure& closure, |
+ base::TimeDelta delay) override { |
+ // Tasks are never nested within the task scheduler. |
+ return PostDelayedTask(from_here, closure, delay); |
+ } |
+ |
+ bool RunsTasksOnCurrentThread() const override { |
+ return tls_current_shared_priority_queue.Get().Get() == priority_queue_; |
+ } |
+ |
+ private: |
+ ~SchedulerSequencedTaskRunner() override = default; |
+ |
+ // Sequence in which all Tasks posted through this TaskRunner are inserted. |
+ const scoped_refptr<Sequence> sequence_ = new Sequence; |
+ |
+ const TaskTraits traits_; |
+ PriorityQueue* const priority_queue_; |
+ TaskTracker* const task_tracker_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner); |
+}; |
+ |
} // namespace |
std::unique_ptr<SchedulerThreadPool> SchedulerThreadPool::CreateThreadPool( |
@@ -92,8 +138,11 @@ scoped_refptr<TaskRunner> SchedulerThreadPool::CreateTaskRunnerWithTraits( |
traits, &shared_priority_queue_, task_tracker_)); |
case ExecutionMode::SEQUENCED: |
+ return make_scoped_refptr(new SchedulerSequencedTaskRunner( |
+ traits, &shared_priority_queue_, task_tracker_)); |
+ |
case ExecutionMode::SINGLE_THREADED: |
- // TODO(fdoray): Support SEQUENCED and SINGLE_THREADED TaskRunners. |
+ // TODO(fdoray): Support SINGLE_THREADED TaskRunners. |
NOTREACHED(); |
return nullptr; |
} |