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 62b6562374f007441e4b317b62163cf6fbc20d1a..4f66fbc0456d4e02c46c190e7e2fbc6f58a68c87 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/task_tracker.h" |
namespace base { |
@@ -59,6 +60,49 @@ 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()); |
+ PostTaskHelper(WrapUnique(new Task(from_here, closure, traits_)), sequence_, |
+ priority_queue_, task_tracker_); |
+ return true; |
+ } |
+ |
+ 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 g_current_shared_priority_queue.Get().Get() == priority_queue_; |
+ } |
+ |
+ private: |
+ ~SchedulerSequencedTaskRunner() override = default; |
+ |
+ const TaskTraits traits_; |
+ const scoped_refptr<Sequence> sequence_ = new Sequence; |
+ PriorityQueue* const priority_queue_; |
+ TaskTracker* const task_tracker_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner); |
+}; |
+ |
void PostTaskCallback(scoped_refptr<Sequence> sequence, |
PriorityQueue* priority_queue, |
std::unique_ptr<Task> task) { |
@@ -107,6 +151,9 @@ 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: |
NOTIMPLEMENTED(); |
return nullptr; |