Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(400)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc

Issue 2572893002: [Reland] Dont post delayed DoWork for disabled queues. (Closed)
Patch Set: Fix compile Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 if (main_thread_only().delayed_incoming_queue.top().delayed_run_time == 280 // wakeup even if blocked by a fence, because we'd break throttling logic
281 delayed_run_time) { 281 // otherwise.
282 main_thread_only().time_domain->ScheduleDelayedWork( 282 base::TimeTicks next_delayed_task =
283 this, pending_task.delayed_run_time, now); 283 main_thread_only().delayed_incoming_queue.top().delayed_run_time;
284 if (next_delayed_task == delayed_run_time && IsQueueEnabled()) {
285 main_thread_only().time_domain->ScheduleDelayedWork(this, delayed_run_time,
286 now);
284 } 287 }
285 288
286 TraceQueueSize(false); 289 TraceQueueSize(false);
287 } 290 }
288 291
289 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { 292 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) {
290 any_thread().task_queue_manager->DidQueueTask(pending_task); 293 any_thread().task_queue_manager->DidQueueTask(pending_task);
291 294
292 int thread_hop_task_sequence_number = 295 int thread_hop_task_sequence_number =
293 any_thread().task_queue_manager->GetNextSequenceNumber(); 296 any_thread().task_queue_manager->GetNextSequenceNumber();
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 main_thread_only().time_domain->CreateLazyNow().Now()) { 400 main_thread_only().time_domain->CreateLazyNow().Now()) {
398 return true; 401 return true;
399 } 402 }
400 403
401 // Finally tasks on |immediate_incoming_queue| count as immediate work. 404 // Finally tasks on |immediate_incoming_queue| count as immediate work.
402 base::AutoLock lock(any_thread_lock_); 405 base::AutoLock lock(any_thread_lock_);
403 return !any_thread().immediate_incoming_queue.empty(); 406 return !any_thread().immediate_incoming_queue.empty();
404 } 407 }
405 408
406 base::Optional<base::TimeTicks> TaskQueueImpl::GetNextScheduledWakeUp() { 409 base::Optional<base::TimeTicks> TaskQueueImpl::GetNextScheduledWakeUp() {
407 if (main_thread_only().delayed_incoming_queue.empty()) 410 // Note we don't scheduled a wakeup for disabled queues.
411 if (main_thread_only().delayed_incoming_queue.empty() || !IsQueueEnabled())
408 return base::nullopt; 412 return base::nullopt;
409 413
410 return main_thread_only().delayed_incoming_queue.top().delayed_run_time; 414 return main_thread_only().delayed_incoming_queue.top().delayed_run_time;
411 } 415 }
412 416
413 base::Optional<base::TimeTicks> TaskQueueImpl::WakeUpForDelayedWork( 417 base::Optional<base::TimeTicks> TaskQueueImpl::WakeUpForDelayedWork(
414 LazyNow* lazy_now) { 418 LazyNow* lazy_now) {
415 // Enqueue all delayed tasks that should be running now, skipping any that 419 // Enqueue all delayed tasks that should be running now, skipping any that
416 // have been canceled. 420 // have been canceled.
417 while (!main_thread_only().delayed_incoming_queue.empty()) { 421 while (!main_thread_only().delayed_incoming_queue.empty()) {
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 if (time_domain == main_thread_only().time_domain) 578 if (time_domain == main_thread_only().time_domain)
575 return; 579 return;
576 580
577 any_thread().time_domain = time_domain; 581 any_thread().time_domain = time_domain;
578 } 582 }
579 583
580 main_thread_only().time_domain->UnregisterQueue(this); 584 main_thread_only().time_domain->UnregisterQueue(this);
581 main_thread_only().time_domain = time_domain; 585 main_thread_only().time_domain = time_domain;
582 time_domain->RegisterQueue(this); 586 time_domain->RegisterQueue(this);
583 587
584 if (!main_thread_only().delayed_incoming_queue.empty()) { 588 if (IsQueueEnabled() && !main_thread_only().delayed_incoming_queue.empty()) {
585 time_domain->ScheduleDelayedWork( 589 time_domain->ScheduleDelayedWork(
586 this, main_thread_only().delayed_incoming_queue.top().delayed_run_time, 590 this, main_thread_only().delayed_incoming_queue.top().delayed_run_time,
587 time_domain->Now()); 591 time_domain->Now());
588 } 592 }
589 } 593 }
590 594
591 TimeDomain* TaskQueueImpl::GetTimeDomain() const { 595 TimeDomain* TaskQueueImpl::GetTimeDomain() const {
592 if (base::PlatformThread::CurrentId() == thread_id_) 596 if (base::PlatformThread::CurrentId() == thread_id_)
593 return main_thread_only().time_domain; 597 return main_thread_only().time_domain;
594 598
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 bool is_enabled = IsQueueEnabled(); 796 bool is_enabled = IsQueueEnabled();
793 if (was_enabled != is_enabled) 797 if (was_enabled != is_enabled)
794 EnableOrDisableWithSelector(is_enabled); 798 EnableOrDisableWithSelector(is_enabled);
795 } 799 }
796 800
797 void TaskQueueImpl::EnableOrDisableWithSelector(bool enable) { 801 void TaskQueueImpl::EnableOrDisableWithSelector(bool enable) {
798 if (!main_thread_only().task_queue_manager) 802 if (!main_thread_only().task_queue_manager)
799 return; 803 return;
800 804
801 if (enable) { 805 if (enable) {
806 if (!main_thread_only().delayed_incoming_queue.empty()) {
807 main_thread_only().time_domain->ScheduleDelayedWork(
808 this,
809 main_thread_only().delayed_incoming_queue.top().delayed_run_time,
810 main_thread_only().time_domain->Now());
811 }
802 // Note the selector calls TaskQueueManager::OnTaskQueueEnabled which posts 812 // Note the selector calls TaskQueueManager::OnTaskQueueEnabled which posts
803 // a DoWork if needed. 813 // a DoWork if needed.
804 main_thread_only().task_queue_manager->selector_.EnableQueue(this); 814 main_thread_only().task_queue_manager->selector_.EnableQueue(this);
805 } else { 815 } else {
816 if (!main_thread_only().delayed_incoming_queue.empty())
817 main_thread_only().time_domain->CancelDelayedWork(this);
806 main_thread_only().task_queue_manager->selector_.DisableQueue(this); 818 main_thread_only().task_queue_manager->selector_.DisableQueue(this);
807 } 819 }
808 } 820 }
809 821
810 std::unique_ptr<TaskQueueImpl::QueueEnabledVoter> 822 std::unique_ptr<TaskQueueImpl::QueueEnabledVoter>
811 TaskQueueImpl::CreateQueueEnabledVoter() { 823 TaskQueueImpl::CreateQueueEnabledVoter() {
812 main_thread_only().voter_refcount++; 824 main_thread_only().voter_refcount++;
813 main_thread_only().is_enabled_refcount++; 825 main_thread_only().is_enabled_refcount++;
814 return base::MakeUnique<QueueEnabledVoterImpl>(this); 826 return base::MakeUnique<QueueEnabledVoterImpl>(this);
815 } 827 }
(...skipping 15 matching lines...) Expand all
831 main_thread_only().delayed_incoming_queue.pop(); 843 main_thread_only().delayed_incoming_queue.pop();
832 } 844 }
833 845
834 main_thread_only().delayed_incoming_queue = std::move(remaining_tasks); 846 main_thread_only().delayed_incoming_queue = std::move(remaining_tasks);
835 847
836 // Re-schedule delayed call to WakeUpForDelayedWork if needed. 848 // Re-schedule delayed call to WakeUpForDelayedWork if needed.
837 if (main_thread_only().delayed_incoming_queue.empty()) { 849 if (main_thread_only().delayed_incoming_queue.empty()) {
838 main_thread_only().time_domain->CancelDelayedWork(this); 850 main_thread_only().time_domain->CancelDelayedWork(this);
839 } else if (first_task_runtime != 851 } else if (first_task_runtime !=
840 main_thread_only().delayed_incoming_queue.top().delayed_run_time) { 852 main_thread_only().delayed_incoming_queue.top().delayed_run_time) {
841 main_thread_only().time_domain->ScheduleDelayedWork( 853 if (IsQueueEnabled()) {
842 this, main_thread_only().delayed_incoming_queue.top().delayed_run_time, 854 main_thread_only().time_domain->ScheduleDelayedWork(
843 main_thread_only().time_domain->Now()); 855 this,
856 main_thread_only().delayed_incoming_queue.top().delayed_run_time,
857 main_thread_only().time_domain->Now());
858 }
844 } 859 }
845 } 860 }
846 861
847 void TaskQueueImpl::PushImmediateIncomingTaskForTest( 862 void TaskQueueImpl::PushImmediateIncomingTaskForTest(
848 TaskQueueImpl::Task&& task) { 863 TaskQueueImpl::Task&& task) {
849 base::AutoLock lock(any_thread_lock_); 864 base::AutoLock lock(any_thread_lock_);
850 any_thread().immediate_incoming_queue.push_back(std::move(task)); 865 any_thread().immediate_incoming_queue.push_back(std::move(task));
851 } 866 }
852 867
853 } // namespace internal 868 } // namespace internal
854 } // namespace scheduler 869 } // namespace scheduler
855 } // namespace blink 870 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698