OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/task_scheduler/scheduler_thread_pool.h" | 5 #include "base/task_scheduler/scheduler_thread_pool.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "base/sequenced_task_runner.h" |
14 #include "base/task_scheduler/task_tracker.h" | 15 #include "base/task_scheduler/task_tracker.h" |
15 | 16 |
16 namespace base { | 17 namespace base { |
17 namespace internal { | 18 namespace internal { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 // Shared PriorityQueue of a thread's SchedulerThreadPool. Not set for threads | 22 // Shared PriorityQueue of a thread's SchedulerThreadPool. Not set for threads |
22 // that don't belong to a SchedulerThreadPool. | 23 // that don't belong to a SchedulerThreadPool. |
23 LazyInstance<ThreadLocalPointer<const PriorityQueue>>::Leaky | 24 LazyInstance<ThreadLocalPointer<const PriorityQueue>>::Leaky |
(...skipping 28 matching lines...) Expand all Loading... |
52 private: | 53 private: |
53 ~SchedulerParallelTaskRunner() override = default; | 54 ~SchedulerParallelTaskRunner() override = default; |
54 | 55 |
55 const TaskTraits traits_; | 56 const TaskTraits traits_; |
56 PriorityQueue* const priority_queue_; | 57 PriorityQueue* const priority_queue_; |
57 TaskTracker* const task_tracker_; | 58 TaskTracker* const task_tracker_; |
58 | 59 |
59 DISALLOW_COPY_AND_ASSIGN(SchedulerParallelTaskRunner); | 60 DISALLOW_COPY_AND_ASSIGN(SchedulerParallelTaskRunner); |
60 }; | 61 }; |
61 | 62 |
| 63 // A task runner that runs tasks with the SEQUENCED ExecutionMode. |
| 64 class SchedulerSequencedTaskRunner : public SequencedTaskRunner { |
| 65 public: |
| 66 SchedulerSequencedTaskRunner(const TaskTraits& traits, |
| 67 PriorityQueue* priority_queue, |
| 68 TaskTracker* task_tracker) |
| 69 : traits_(traits), |
| 70 priority_queue_(priority_queue), |
| 71 task_tracker_(task_tracker) {} |
| 72 |
| 73 // SequencedTaskRunner: |
| 74 bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 75 const Closure& closure, |
| 76 TimeDelta delay) override { |
| 77 // TODO(fdoray): Support delayed tasks. |
| 78 DCHECK(delay.is_zero()); |
| 79 PostTaskHelper(WrapUnique(new Task(from_here, closure, traits_)), sequence_, |
| 80 priority_queue_, task_tracker_); |
| 81 return true; |
| 82 } |
| 83 |
| 84 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| 85 const Closure& closure, |
| 86 base::TimeDelta delay) override { |
| 87 // Tasks are never nested within the task scheduler. |
| 88 return PostDelayedTask(from_here, closure, delay); |
| 89 } |
| 90 |
| 91 bool RunsTasksOnCurrentThread() const override { |
| 92 return g_current_shared_priority_queue.Get().Get() == priority_queue_; |
| 93 } |
| 94 |
| 95 private: |
| 96 ~SchedulerSequencedTaskRunner() override = default; |
| 97 |
| 98 const TaskTraits traits_; |
| 99 const scoped_refptr<Sequence> sequence_ = new Sequence; |
| 100 PriorityQueue* const priority_queue_; |
| 101 TaskTracker* const task_tracker_; |
| 102 |
| 103 DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner); |
| 104 }; |
| 105 |
62 void PostTaskCallback(scoped_refptr<Sequence> sequence, | 106 void PostTaskCallback(scoped_refptr<Sequence> sequence, |
63 PriorityQueue* priority_queue, | 107 PriorityQueue* priority_queue, |
64 std::unique_ptr<Task> task) { | 108 std::unique_ptr<Task> task) { |
65 DCHECK(sequence); | 109 DCHECK(sequence); |
66 DCHECK(priority_queue); | 110 DCHECK(priority_queue); |
67 DCHECK(task); | 111 DCHECK(task); |
68 | 112 |
69 if (sequence->PushTask(std::move(task))) { | 113 if (sequence->PushTask(std::move(task))) { |
70 // |sequence| must be inserted into |priority_queue| because it was empty | 114 // |sequence| must be inserted into |priority_queue| because it was empty |
71 // before |task| was inserted into it. | 115 // before |task| was inserted into it. |
(...skipping 28 matching lines...) Expand all Loading... |
100 | 144 |
101 scoped_refptr<TaskRunner> SchedulerThreadPool::CreateTaskRunnerWithTraits( | 145 scoped_refptr<TaskRunner> SchedulerThreadPool::CreateTaskRunnerWithTraits( |
102 const TaskTraits& traits, | 146 const TaskTraits& traits, |
103 ExecutionMode execution_mode) { | 147 ExecutionMode execution_mode) { |
104 switch (execution_mode) { | 148 switch (execution_mode) { |
105 case ExecutionMode::PARALLEL: | 149 case ExecutionMode::PARALLEL: |
106 return make_scoped_refptr(new SchedulerParallelTaskRunner( | 150 return make_scoped_refptr(new SchedulerParallelTaskRunner( |
107 traits, &shared_priority_queue_, task_tracker_)); | 151 traits, &shared_priority_queue_, task_tracker_)); |
108 | 152 |
109 case ExecutionMode::SEQUENCED: | 153 case ExecutionMode::SEQUENCED: |
| 154 return make_scoped_refptr(new SchedulerSequencedTaskRunner( |
| 155 traits, &shared_priority_queue_, task_tracker_)); |
| 156 |
110 case ExecutionMode::SINGLE_THREADED: | 157 case ExecutionMode::SINGLE_THREADED: |
111 NOTIMPLEMENTED(); | 158 NOTIMPLEMENTED(); |
112 return nullptr; | 159 return nullptr; |
113 } | 160 } |
114 | 161 |
115 NOTREACHED(); | 162 NOTREACHED(); |
116 return nullptr; | 163 return nullptr; |
117 } | 164 } |
118 | 165 |
119 void SchedulerThreadPool::ReinsertSequence( | 166 void SchedulerThreadPool::ReinsertSequence( |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 DCHECK(priority_queue); | 302 DCHECK(priority_queue); |
256 DCHECK(task_tracker); | 303 DCHECK(task_tracker); |
257 | 304 |
258 task_tracker->PostTask( | 305 task_tracker->PostTask( |
259 Bind(&PostTaskCallback, std::move(sequence), priority_queue), | 306 Bind(&PostTaskCallback, std::move(sequence), priority_queue), |
260 std::move(task)); | 307 std::move(task)); |
261 } | 308 } |
262 | 309 |
263 } // namespace internal | 310 } // namespace internal |
264 } // namespace base | 311 } // namespace base |
OLD | NEW |