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