OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 // delayed_work_queue | 42 // delayed_work_queue |
43 // | 43 // |
44 // The immediate_incoming_queue can be accessed from any thread, the other | 44 // The immediate_incoming_queue can be accessed from any thread, the other |
45 // queues are main-thread only. To reduce the overhead of locking, | 45 // queues are main-thread only. To reduce the overhead of locking, |
46 // immediate_work_queue is swapped with immediate_incoming_queue when | 46 // immediate_work_queue is swapped with immediate_incoming_queue when |
47 // immediate_work_queue becomes empty. | 47 // immediate_work_queue becomes empty. |
48 // | 48 // |
49 // Delayed tasks are initially posted to delayed_incoming_queue and a wake-up | 49 // Delayed tasks are initially posted to delayed_incoming_queue and a wake-up |
50 // is scheduled with the TimeDomain. When the delay has elapsed, the TimeDomain | 50 // is scheduled with the TimeDomain. When the delay has elapsed, the TimeDomain |
51 // calls UpdateDelayedWorkQueue and ready delayed tasks are moved into the | 51 // calls UpdateDelayedWorkQueue and ready delayed tasks are moved into the |
52 // delayed_work_queue. Note the EnqueueOrder (used for ordering) for a delayed | 52 // delayed_work_queue. |
53 // task is not set until it's moved into the delayed_work_queue. | |
54 // | 53 // |
55 // TaskQueueImpl uses the WorkQueueSets and the TaskQueueSelector to implement | 54 // TaskQueueImpl uses the WorkQueueSets and the TaskQueueSelector to implement |
56 // prioritization. Task selection is done by the TaskQueueSelector and when a | 55 // prioritization. Task selection is done by the TaskQueueSelector and when a |
57 // queue is selected, it round-robins between the immediate_work_queue and | 56 // queue is selected, it round-robins between the immediate_work_queue and |
58 // delayed_work_queue. The reason for this is we want to make sure delayed | 57 // delayed_work_queue. The reason for this is we want to make sure delayed |
59 // tasks (normally the most common type) don't starve out immediate work. | 58 // tasks (normally the most common type) don't starve out immediate work. |
60 class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { | 59 class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
61 public: | 60 public: |
62 TaskQueueImpl(TaskQueueManager* task_queue_manager, | 61 TaskQueueImpl(TaskQueueManager* task_queue_manager, |
63 TimeDomain* time_domain, | 62 TimeDomain* time_domain, |
(...skipping 14 matching lines...) Expand all Loading... |
78 } | 77 } |
79 return time < other.time; | 78 return time < other.time; |
80 } | 79 } |
81 }; | 80 }; |
82 | 81 |
83 class BLINK_PLATFORM_EXPORT Task : public base::PendingTask { | 82 class BLINK_PLATFORM_EXPORT Task : public base::PendingTask { |
84 public: | 83 public: |
85 Task(); | 84 Task(); |
86 Task(const tracked_objects::Location& posted_from, | 85 Task(const tracked_objects::Location& posted_from, |
87 base::OnceClosure task, | 86 base::OnceClosure task, |
88 base::TimeTicks desired_run_time, | 87 EnqueueOrder enqueue_order, |
89 EnqueueOrder sequence_number, | |
90 bool nestable); | 88 bool nestable); |
91 | 89 |
92 Task(const tracked_objects::Location& posted_from, | 90 Task(const tracked_objects::Location& posted_from, |
93 base::OnceClosure task, | 91 base::OnceClosure task, |
94 base::TimeTicks desired_run_time, | 92 base::TimeTicks desired_run_time, |
95 EnqueueOrder sequence_number, | 93 EnqueueOrder sequence_number, |
96 bool nestable, | 94 bool nestable, |
97 EnqueueOrder enqueue_order); | 95 EnqueueOrder enqueue_order); |
98 | 96 |
99 DelayedWakeUp delayed_wake_up() const { | 97 DelayedWakeUp delayed_wake_up() const { |
100 return DelayedWakeUp{delayed_run_time, sequence_num}; | 98 return DelayedWakeUp{delayed_run_time, sequence_num}; |
101 } | 99 } |
102 | 100 |
103 EnqueueOrder enqueue_order() const { | 101 EnqueueOrder enqueue_order() const { |
104 #ifndef NDEBUG | |
105 DCHECK(enqueue_order_set_); | |
106 #endif | |
107 return enqueue_order_; | 102 return enqueue_order_; |
108 } | 103 } |
109 | 104 |
110 void set_enqueue_order(EnqueueOrder enqueue_order) { | |
111 #ifndef NDEBUG | |
112 DCHECK(!enqueue_order_set_); | |
113 enqueue_order_set_ = true; | |
114 #endif | |
115 enqueue_order_ = enqueue_order; | |
116 } | |
117 | |
118 #ifndef NDEBUG | |
119 bool enqueue_order_set() const { return enqueue_order_set_; } | |
120 #endif | |
121 | |
122 private: | 105 private: |
123 #ifndef NDEBUG | |
124 bool enqueue_order_set_; | |
125 #endif | |
126 // Similar to sequence number, but ultimately the |enqueue_order_| is what | 106 // Similar to sequence number, but ultimately the |enqueue_order_| is what |
127 // the scheduler uses for task ordering. For immediate tasks |enqueue_order| | 107 // the scheduler uses for task ordering. For immediate tasks |enqueue_order| |
128 // is set when posted, but for delayed tasks it's not defined until they are | 108 // is set when posted, but for delayed tasks it's not defined until they are |
129 // enqueued on the |delayed_work_queue_|. This is because otherwise delayed | 109 // enqueued on the |delayed_work_queue_|. This is because otherwise delayed |
130 // tasks could run before an immediate task posted after the delayed task. | 110 // tasks could run before an immediate task posted after the delayed task. |
131 EnqueueOrder enqueue_order_; | 111 EnqueueOrder enqueue_order_; |
132 }; | 112 }; |
133 | 113 |
134 // TaskQueue implementation. | 114 // TaskQueue implementation. |
135 void UnregisterTaskQueue() override; | 115 void UnregisterTaskQueue() override; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 scheduled_time_domain_wake_up; | 192 scheduled_time_domain_wake_up; |
213 } | 193 } |
214 | 194 |
215 HeapHandle heap_handle() const { return main_thread_only().heap_handle; } | 195 HeapHandle heap_handle() const { return main_thread_only().heap_handle; } |
216 | 196 |
217 void set_heap_handle(HeapHandle heap_handle) { | 197 void set_heap_handle(HeapHandle heap_handle) { |
218 main_thread_only().heap_handle = heap_handle; | 198 main_thread_only().heap_handle = heap_handle; |
219 } | 199 } |
220 | 200 |
221 void PushImmediateIncomingTaskForTest(TaskQueueImpl::Task&& task); | 201 void PushImmediateIncomingTaskForTest(TaskQueueImpl::Task&& task); |
222 EnqueueOrder GetFenceForTest() const; | 202 uint64_t GetFenceForTest() const; |
223 | 203 |
224 class QueueEnabledVoterImpl : public QueueEnabledVoter { | 204 class QueueEnabledVoterImpl : public QueueEnabledVoter { |
225 public: | 205 public: |
226 explicit QueueEnabledVoterImpl(TaskQueueImpl* task_queue); | 206 explicit QueueEnabledVoterImpl(TaskQueueImpl* task_queue); |
227 ~QueueEnabledVoterImpl() override; | 207 ~QueueEnabledVoterImpl() override; |
228 | 208 |
229 // QueueEnabledVoter implementation. | 209 // QueueEnabledVoter implementation. |
230 void SetQueueEnabled(bool enabled) override; | 210 void SetQueueEnabled(bool enabled) override; |
231 | 211 |
232 TaskQueueImpl* GetTaskQueueForTest() const { return task_queue_.get(); } | 212 TaskQueueImpl* GetTaskQueueForTest() const { return task_queue_.get(); } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 | 257 |
278 std::unique_ptr<WorkQueue> delayed_work_queue; | 258 std::unique_ptr<WorkQueue> delayed_work_queue; |
279 std::unique_ptr<WorkQueue> immediate_work_queue; | 259 std::unique_ptr<WorkQueue> immediate_work_queue; |
280 std::priority_queue<Task> delayed_incoming_queue; | 260 std::priority_queue<Task> delayed_incoming_queue; |
281 base::ObserverList<base::MessageLoop::TaskObserver> task_observers; | 261 base::ObserverList<base::MessageLoop::TaskObserver> task_observers; |
282 size_t set_index; | 262 size_t set_index; |
283 HeapHandle heap_handle; | 263 HeapHandle heap_handle; |
284 int is_enabled_refcount; | 264 int is_enabled_refcount; |
285 int voter_refcount; | 265 int voter_refcount; |
286 base::trace_event::BlameContext* blame_context; // Not owned. | 266 base::trace_event::BlameContext* blame_context; // Not owned. |
287 EnqueueOrder current_fence; | 267 uint64_t current_fence; |
288 base::TimeTicks scheduled_time_domain_wake_up; | 268 base::TimeTicks scheduled_time_domain_wake_up; |
289 }; | 269 }; |
290 | 270 |
291 ~TaskQueueImpl() override; | 271 ~TaskQueueImpl() override; |
292 | 272 |
293 bool PostImmediateTaskImpl(const tracked_objects::Location& from_here, | 273 bool PostImmediateTaskImpl(const tracked_objects::Location& from_here, |
294 base::OnceClosure task, | 274 base::OnceClosure task, |
295 TaskType task_type); | 275 TaskType task_type); |
296 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, | 276 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, |
297 base::OnceClosure task, | 277 base::OnceClosure task, |
(...skipping 12 matching lines...) Expand all Loading... |
310 void ScheduleDelayedWorkTask(Task pending_task); | 290 void ScheduleDelayedWorkTask(Task pending_task); |
311 | 291 |
312 void MoveReadyImmediateTasksToImmediateWorkQueueLocked(); | 292 void MoveReadyImmediateTasksToImmediateWorkQueueLocked(); |
313 | 293 |
314 // Push the task onto the |immediate_incoming_queue| and for auto pumped | 294 // Push the task onto the |immediate_incoming_queue| and for auto pumped |
315 // queues it calls MaybePostDoWorkOnMainRunner if the Incoming queue was | 295 // queues it calls MaybePostDoWorkOnMainRunner if the Incoming queue was |
316 // empty. | 296 // empty. |
317 void PushOntoImmediateIncomingQueueLocked( | 297 void PushOntoImmediateIncomingQueueLocked( |
318 const tracked_objects::Location& posted_from, | 298 const tracked_objects::Location& posted_from, |
319 base::OnceClosure task, | 299 base::OnceClosure task, |
320 base::TimeTicks desired_run_time, | 300 EnqueueOrder enqueue_order, |
321 EnqueueOrder sequence_number, | |
322 bool nestable); | 301 bool nestable); |
323 | 302 |
324 // Extracts all the tasks from the immediate incoming queue and clears it. | 303 // Extracts all the tasks from the immediate incoming queue and clears it. |
325 // Can be called from any thread. | 304 // Can be called from any thread. |
326 WTF::Deque<TaskQueueImpl::Task> TakeImmediateIncomingQueue(); | 305 WTF::Deque<TaskQueueImpl::Task> TakeImmediateIncomingQueue(); |
327 | 306 |
328 void TraceQueueSize() const; | 307 void TraceQueueSize() const; |
329 static void QueueAsValueInto(const WTF::Deque<Task>& queue, | 308 static void QueueAsValueInto(const WTF::Deque<Task>& queue, |
330 base::trace_event::TracedValue* state); | 309 base::trace_event::TracedValue* state); |
331 static void QueueAsValueInto(const std::priority_queue<Task>& queue, | 310 static void QueueAsValueInto(const std::priority_queue<Task>& queue, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 const bool should_report_when_execution_blocked_; | 366 const bool should_report_when_execution_blocked_; |
388 | 367 |
389 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); | 368 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); |
390 }; | 369 }; |
391 | 370 |
392 } // namespace internal | 371 } // namespace internal |
393 } // namespace scheduler | 372 } // namespace scheduler |
394 } // namespace blink | 373 } // namespace blink |
395 | 374 |
396 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 375 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
OLD | NEW |