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 #include "platform/scheduler/base/task_queue_impl.h" | 5 #include "platform/scheduler/base/task_queue_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 base::TimeTicks(), | 112 base::TimeTicks(), |
113 true), | 113 true), |
114 #ifndef NDEBUG | 114 #ifndef NDEBUG |
115 enqueue_order_set_(false), | 115 enqueue_order_set_(false), |
116 #endif | 116 #endif |
117 enqueue_order_(0) { | 117 enqueue_order_(0) { |
118 sequence_num = 0; | 118 sequence_num = 0; |
119 } | 119 } |
120 | 120 |
121 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, | 121 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
122 base::Closure task, | 122 base::OnceClosure task, |
123 base::TimeTicks desired_run_time, | 123 base::TimeTicks desired_run_time, |
124 EnqueueOrder sequence_number, | 124 EnqueueOrder sequence_number, |
125 bool nestable) | 125 bool nestable) |
126 : PendingTask(posted_from, std::move(task), desired_run_time, nestable), | 126 : PendingTask(posted_from, std::move(task), desired_run_time, nestable), |
127 #ifndef NDEBUG | 127 #ifndef NDEBUG |
128 enqueue_order_set_(false), | 128 enqueue_order_set_(false), |
129 #endif | 129 #endif |
130 enqueue_order_(0) { | 130 enqueue_order_(0) { |
131 sequence_num = sequence_number; | 131 sequence_num = sequence_number; |
132 } | 132 } |
133 | 133 |
134 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, | 134 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
135 base::Closure task, | 135 base::OnceClosure task, |
136 base::TimeTicks desired_run_time, | 136 base::TimeTicks desired_run_time, |
137 EnqueueOrder sequence_number, | 137 EnqueueOrder sequence_number, |
138 bool nestable, | 138 bool nestable, |
139 EnqueueOrder enqueue_order) | 139 EnqueueOrder enqueue_order) |
140 : PendingTask(posted_from, std::move(task), desired_run_time, nestable), | 140 : PendingTask(posted_from, std::move(task), desired_run_time, nestable), |
141 #ifndef NDEBUG | 141 #ifndef NDEBUG |
142 enqueue_order_set_(true), | 142 enqueue_order_set_(true), |
143 #endif | 143 #endif |
144 enqueue_order_(enqueue_order) { | 144 enqueue_order_(enqueue_order) { |
145 sequence_num = sequence_number; | 145 sequence_num = sequence_number; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 immediate_incoming_queue().clear(); | 187 immediate_incoming_queue().clear(); |
188 main_thread_only().immediate_work_queue.reset(); | 188 main_thread_only().immediate_work_queue.reset(); |
189 main_thread_only().delayed_work_queue.reset(); | 189 main_thread_only().delayed_work_queue.reset(); |
190 } | 190 } |
191 | 191 |
192 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { | 192 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
193 return base::PlatformThread::CurrentId() == thread_id_; | 193 return base::PlatformThread::CurrentId() == thread_id_; |
194 } | 194 } |
195 | 195 |
196 bool TaskQueueImpl::PostDelayedTask(const tracked_objects::Location& from_here, | 196 bool TaskQueueImpl::PostDelayedTask(const tracked_objects::Location& from_here, |
197 base::Closure task, | 197 base::OnceClosure task, |
198 base::TimeDelta delay) { | 198 base::TimeDelta delay) { |
199 if (delay.is_zero()) | 199 if (delay.is_zero()) |
200 return PostImmediateTaskImpl(from_here, std::move(task), TaskType::NORMAL); | 200 return PostImmediateTaskImpl(from_here, std::move(task), TaskType::NORMAL); |
201 | 201 |
202 return PostDelayedTaskImpl(from_here, std::move(task), delay, | 202 return PostDelayedTaskImpl(from_here, std::move(task), delay, |
203 TaskType::NORMAL); | 203 TaskType::NORMAL); |
204 } | 204 } |
205 | 205 |
206 bool TaskQueueImpl::PostNonNestableDelayedTask( | 206 bool TaskQueueImpl::PostNonNestableDelayedTask( |
207 const tracked_objects::Location& from_here, | 207 const tracked_objects::Location& from_here, |
208 base::Closure task, | 208 base::OnceClosure task, |
209 base::TimeDelta delay) { | 209 base::TimeDelta delay) { |
210 if (delay.is_zero()) | 210 if (delay.is_zero()) |
211 return PostImmediateTaskImpl(from_here, std::move(task), | 211 return PostImmediateTaskImpl(from_here, std::move(task), |
212 TaskType::NON_NESTABLE); | 212 TaskType::NON_NESTABLE); |
213 | 213 |
214 return PostDelayedTaskImpl(from_here, std::move(task), delay, | 214 return PostDelayedTaskImpl(from_here, std::move(task), delay, |
215 TaskType::NON_NESTABLE); | 215 TaskType::NON_NESTABLE); |
216 } | 216 } |
217 | 217 |
218 bool TaskQueueImpl::PostImmediateTaskImpl( | 218 bool TaskQueueImpl::PostImmediateTaskImpl( |
219 const tracked_objects::Location& from_here, | 219 const tracked_objects::Location& from_here, |
220 base::Closure task, | 220 base::OnceClosure task, |
221 TaskType task_type) { | 221 TaskType task_type) { |
222 DCHECK(task); | 222 DCHECK(task); |
223 base::AutoLock lock(any_thread_lock_); | 223 base::AutoLock lock(any_thread_lock_); |
224 if (!any_thread().task_queue_manager) | 224 if (!any_thread().task_queue_manager) |
225 return false; | 225 return false; |
226 | 226 |
227 EnqueueOrder sequence_number = | 227 EnqueueOrder sequence_number = |
228 any_thread().task_queue_manager->GetNextSequenceNumber(); | 228 any_thread().task_queue_manager->GetNextSequenceNumber(); |
229 | 229 |
230 PushOntoImmediateIncomingQueueLocked(from_here, std::move(task), | 230 PushOntoImmediateIncomingQueueLocked(from_here, std::move(task), |
231 base::TimeTicks(), sequence_number, | 231 base::TimeTicks(), sequence_number, |
232 task_type != TaskType::NON_NESTABLE); | 232 task_type != TaskType::NON_NESTABLE); |
233 return true; | 233 return true; |
234 } | 234 } |
235 | 235 |
236 bool TaskQueueImpl::PostDelayedTaskImpl( | 236 bool TaskQueueImpl::PostDelayedTaskImpl( |
237 const tracked_objects::Location& from_here, | 237 const tracked_objects::Location& from_here, |
238 base::Closure task, | 238 base::OnceClosure task, |
239 base::TimeDelta delay, | 239 base::TimeDelta delay, |
240 TaskType task_type) { | 240 TaskType task_type) { |
241 DCHECK(task); | 241 DCHECK(task); |
242 DCHECK_GT(delay, base::TimeDelta()); | 242 DCHECK_GT(delay, base::TimeDelta()); |
243 if (base::PlatformThread::CurrentId() == thread_id_) { | 243 if (base::PlatformThread::CurrentId() == thread_id_) { |
244 // Lock-free fast path for delayed tasks posted from the main thread. | 244 // Lock-free fast path for delayed tasks posted from the main thread. |
245 if (!main_thread_only().task_queue_manager) | 245 if (!main_thread_only().task_queue_manager) |
246 return false; | 246 return false; |
247 | 247 |
248 EnqueueOrder sequence_number = | 248 EnqueueOrder sequence_number = |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 } else { | 325 } else { |
326 // If |delayed_run_time| is in the future we can queue it as normal. | 326 // If |delayed_run_time| is in the future we can queue it as normal. |
327 PushOntoDelayedIncomingQueueFromMainThread(std::move(pending_task), | 327 PushOntoDelayedIncomingQueueFromMainThread(std::move(pending_task), |
328 time_domain_now); | 328 time_domain_now); |
329 } | 329 } |
330 TraceQueueSize(); | 330 TraceQueueSize(); |
331 } | 331 } |
332 | 332 |
333 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( | 333 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
334 const tracked_objects::Location& posted_from, | 334 const tracked_objects::Location& posted_from, |
335 base::Closure task, | 335 base::OnceClosure task, |
336 base::TimeTicks desired_run_time, | 336 base::TimeTicks desired_run_time, |
337 EnqueueOrder sequence_number, | 337 EnqueueOrder sequence_number, |
338 bool nestable) { | 338 bool nestable) { |
339 // If the |immediate_incoming_queue| is empty we need a DoWork posted to make | 339 // If the |immediate_incoming_queue| is empty we need a DoWork posted to make |
340 // it run. | 340 // it run. |
341 bool was_immediate_incoming_queue_empty; | 341 bool was_immediate_incoming_queue_empty; |
342 | 342 |
343 { | 343 { |
344 base::AutoLock lock(immediate_incoming_queue_lock_); | 344 base::AutoLock lock(immediate_incoming_queue_lock_); |
345 was_immediate_incoming_queue_empty = immediate_incoming_queue().empty(); | 345 was_immediate_incoming_queue_empty = immediate_incoming_queue().empty(); |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 | 887 |
888 void TaskQueueImpl::PushImmediateIncomingTaskForTest( | 888 void TaskQueueImpl::PushImmediateIncomingTaskForTest( |
889 TaskQueueImpl::Task&& task) { | 889 TaskQueueImpl::Task&& task) { |
890 base::AutoLock lock(immediate_incoming_queue_lock_); | 890 base::AutoLock lock(immediate_incoming_queue_lock_); |
891 immediate_incoming_queue().push_back(std::move(task)); | 891 immediate_incoming_queue().push_back(std::move(task)); |
892 } | 892 } |
893 | 893 |
894 } // namespace internal | 894 } // namespace internal |
895 } // namespace scheduler | 895 } // namespace scheduler |
896 } // namespace blink | 896 } // namespace blink |
OLD | NEW |