| 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 "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/trace_event/blame_context.h" | 10 #include "base/trace_event/blame_context.h" |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 return true; | 269 return true; |
| 270 } | 270 } |
| 271 | 271 |
| 272 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( | 272 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
| 273 Task pending_task, base::TimeTicks now) { | 273 Task pending_task, base::TimeTicks now) { |
| 274 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; | 274 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
| 275 main_thread_only().task_queue_manager->DidQueueTask(pending_task); | 275 main_thread_only().task_queue_manager->DidQueueTask(pending_task); |
| 276 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); | 276 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
| 277 | 277 |
| 278 // If |pending_task| is at the head of the queue, then make sure a wakeup | 278 // If |pending_task| is at the head of the queue, then make sure a wakeup |
| 279 // is requested if the queue is enabled. Note we still want to schedule a | 279 // is requested. |
| 280 // wakeup even if blocked by a fence, because we'd break throttling logic | 280 if (main_thread_only().delayed_incoming_queue.top().delayed_run_time == |
| 281 // otherwise. | 281 delayed_run_time) { |
| 282 base::TimeTicks next_delayed_task = | 282 main_thread_only().time_domain->ScheduleDelayedWork( |
| 283 main_thread_only().delayed_incoming_queue.top().delayed_run_time; | 283 this, pending_task.delayed_run_time, now); |
| 284 if (next_delayed_task == delayed_run_time && IsQueueEnabled()) { | |
| 285 LazyNow lazy_now(now); | |
| 286 main_thread_only().time_domain->ScheduleDelayedWork(this, delayed_run_time, | |
| 287 &lazy_now); | |
| 288 } | 284 } |
| 289 | 285 |
| 290 TraceQueueSize(false); | 286 TraceQueueSize(false); |
| 291 } | 287 } |
| 292 | 288 |
| 293 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { | 289 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { |
| 294 any_thread().task_queue_manager->DidQueueTask(pending_task); | 290 any_thread().task_queue_manager->DidQueueTask(pending_task); |
| 295 | 291 |
| 296 int thread_hop_task_sequence_number = | 292 int thread_hop_task_sequence_number = |
| 297 any_thread().task_queue_manager->GetNextSequenceNumber(); | 293 any_thread().task_queue_manager->GetNextSequenceNumber(); |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 bool is_enabled = IsQueueEnabled(); | 809 bool is_enabled = IsQueueEnabled(); |
| 814 if (was_enabled != is_enabled) | 810 if (was_enabled != is_enabled) |
| 815 EnableOrDisableWithSelector(is_enabled); | 811 EnableOrDisableWithSelector(is_enabled); |
| 816 } | 812 } |
| 817 | 813 |
| 818 void TaskQueueImpl::EnableOrDisableWithSelector(bool enable) { | 814 void TaskQueueImpl::EnableOrDisableWithSelector(bool enable) { |
| 819 if (!main_thread_only().task_queue_manager) | 815 if (!main_thread_only().task_queue_manager) |
| 820 return; | 816 return; |
| 821 | 817 |
| 822 if (enable) { | 818 if (enable) { |
| 823 if (!main_thread_only().delayed_incoming_queue.empty()) { | |
| 824 LazyNow lazy_now = main_thread_only().time_domain->CreateLazyNow(); | |
| 825 main_thread_only().time_domain->ScheduleDelayedWork( | |
| 826 this, | |
| 827 main_thread_only().delayed_incoming_queue.top().delayed_run_time, | |
| 828 &lazy_now); | |
| 829 } | |
| 830 // Note it's the job of the selector to tell the TaskQueueManager if | 819 // Note it's the job of the selector to tell the TaskQueueManager if |
| 831 // an immediate DoWork needs posting. | 820 // a DoWork needs posting. |
| 832 main_thread_only().task_queue_manager->selector_.EnableQueue(this); | 821 main_thread_only().task_queue_manager->selector_.EnableQueue(this); |
| 833 } else { | 822 } else { |
| 834 if (!main_thread_only().delayed_incoming_queue.empty()) | |
| 835 main_thread_only().time_domain->CancelDelayedWork(this); | |
| 836 main_thread_only().task_queue_manager->selector_.DisableQueue(this); | 823 main_thread_only().task_queue_manager->selector_.DisableQueue(this); |
| 837 } | 824 } |
| 838 } | 825 } |
| 839 | 826 |
| 840 std::unique_ptr<TaskQueueImpl::QueueEnabledVoter> | 827 std::unique_ptr<TaskQueueImpl::QueueEnabledVoter> |
| 841 TaskQueueImpl::CreateQueueEnabledVoter() { | 828 TaskQueueImpl::CreateQueueEnabledVoter() { |
| 842 main_thread_only().voter_refcount++; | 829 main_thread_only().voter_refcount++; |
| 843 main_thread_only().is_enabled_refcount++; | 830 main_thread_only().is_enabled_refcount++; |
| 844 return base::MakeUnique<QueueEnabledVoterImpl>(this); | 831 return base::MakeUnique<QueueEnabledVoterImpl>(this); |
| 845 } | 832 } |
| 846 | 833 |
| 847 } // namespace internal | 834 } // namespace internal |
| 848 } // namespace scheduler | 835 } // namespace scheduler |
| 849 } // namespace blink | 836 } // namespace blink |
| OLD | NEW |