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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 base::TimeTicks time_domain_now = any_thread().time_domain->Now(); | 272 base::TimeTicks time_domain_now = any_thread().time_domain->Now(); |
273 base::TimeTicks time_domain_delayed_run_time = time_domain_now + delay; | 273 base::TimeTicks time_domain_delayed_run_time = time_domain_now + delay; |
274 PushOntoDelayedIncomingQueueLocked( | 274 PushOntoDelayedIncomingQueueLocked( |
275 Task(from_here, std::move(task), time_domain_delayed_run_time, | 275 Task(from_here, std::move(task), time_domain_delayed_run_time, |
276 sequence_number, task_type != TaskType::NON_NESTABLE)); | 276 sequence_number, task_type != TaskType::NON_NESTABLE)); |
277 } | 277 } |
278 return true; | 278 return true; |
279 } | 279 } |
280 | 280 |
281 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( | 281 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
282 Task pending_task, base::TimeTicks now) { | 282 Task pending_task, |
| 283 base::TimeTicks now) { |
283 DelayedWakeUp wake_up = pending_task.delayed_wake_up(); | 284 DelayedWakeUp wake_up = pending_task.delayed_wake_up(); |
284 main_thread_only().task_queue_manager->DidQueueTask(pending_task); | 285 main_thread_only().task_queue_manager->DidQueueTask(pending_task); |
285 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); | 286 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
286 | 287 |
287 // If |pending_task| is at the head of the queue, then make sure a wake-up | 288 // If |pending_task| is at the head of the queue, then make sure a wake-up |
288 // is requested if the queue is enabled. Note we still want to schedule a | 289 // is requested if the queue is enabled. Note we still want to schedule a |
289 // wake-up even if blocked by a fence, because we'd break throttling logic | 290 // wake-up even if blocked by a fence, because we'd break throttling logic |
290 // otherwise. | 291 // otherwise. |
291 DelayedWakeUp new_wake_up = | 292 DelayedWakeUp new_wake_up = |
292 main_thread_only().delayed_incoming_queue.top().delayed_wake_up(); | 293 main_thread_only().delayed_incoming_queue.top().delayed_wake_up(); |
293 if (wake_up.time == new_wake_up.time && | 294 if (wake_up.time == new_wake_up.time && |
294 wake_up.sequence_num == new_wake_up.sequence_num) { | 295 wake_up.sequence_num == new_wake_up.sequence_num) { |
295 ScheduleDelayedWorkInTimeDomain(now); | 296 ScheduleDelayedWorkInTimeDomain(now); |
296 } | 297 } |
297 | 298 |
298 TraceQueueSize(); | 299 TraceQueueSize(); |
299 } | 300 } |
300 | 301 |
301 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { | 302 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { |
302 any_thread().task_queue_manager->DidQueueTask(pending_task); | 303 any_thread().task_queue_manager->DidQueueTask(pending_task); |
303 | 304 |
304 int thread_hop_task_sequence_number = | 305 int thread_hop_task_sequence_number = |
305 any_thread().task_queue_manager->GetNextSequenceNumber(); | 306 any_thread().task_queue_manager->GetNextSequenceNumber(); |
306 PushOntoImmediateIncomingQueueLocked( | 307 PushOntoImmediateIncomingQueueLocked( |
307 FROM_HERE, | 308 FROM_HERE, |
308 base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, | 309 base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
309 base::Passed(&pending_task)), | 310 base::Passed(&pending_task)), |
310 base::TimeTicks(), | 311 base::TimeTicks(), thread_hop_task_sequence_number, false); |
311 thread_hop_task_sequence_number, | |
312 false); | |
313 } | 312 } |
314 | 313 |
315 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { | 314 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { |
316 DCHECK(main_thread_checker_.CalledOnValidThread()); | 315 DCHECK(main_thread_checker_.CalledOnValidThread()); |
317 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; | 316 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
318 base::TimeTicks time_domain_now = main_thread_only().time_domain->Now(); | 317 base::TimeTicks time_domain_now = main_thread_only().time_domain->Now(); |
319 if (delayed_run_time <= time_domain_now) { | 318 if (delayed_run_time <= time_domain_now) { |
320 // If |delayed_run_time| is in the past then push it onto the work queue | 319 // If |delayed_run_time| is in the past then push it onto the work queue |
321 // immediately. To ensure the right task ordering we need to temporarily | 320 // immediately. To ensure the right task ordering we need to temporarily |
322 // push it onto the |delayed_incoming_queue|. | 321 // push it onto the |delayed_incoming_queue|. |
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 } | 928 } |
930 | 929 |
931 // Finally tasks on |immediate_incoming_queue| count as immediate work. | 930 // Finally tasks on |immediate_incoming_queue| count as immediate work. |
932 base::AutoLock lock(immediate_incoming_queue_lock_); | 931 base::AutoLock lock(immediate_incoming_queue_lock_); |
933 return !immediate_incoming_queue().empty(); | 932 return !immediate_incoming_queue().empty(); |
934 } | 933 } |
935 | 934 |
936 } // namespace internal | 935 } // namespace internal |
937 } // namespace scheduler | 936 } // namespace scheduler |
938 } // namespace blink | 937 } // namespace blink |
OLD | NEW |