| 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 |