Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
index 762f079bfccb32600c6b51b777f00741c92f19d8..fee7f311ab1eb2885fe4cf5c7f51be0844a82e76 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
@@ -276,11 +276,14 @@ void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
// If |pending_task| is at the head of the queue, then make sure a wakeup |
- // is requested. |
- if (main_thread_only().delayed_incoming_queue.top().delayed_run_time == |
- delayed_run_time) { |
- main_thread_only().time_domain->ScheduleDelayedWork( |
- this, pending_task.delayed_run_time, now); |
+ // is requested if the queue is enabled. Note we still want to schedule a |
+ // wakeup even if blocked by a fence, because we'd break throttling logic |
+ // otherwise. |
+ base::TimeTicks next_delayed_task = |
+ main_thread_only().delayed_incoming_queue.top().delayed_run_time; |
+ if (next_delayed_task == delayed_run_time && IsQueueEnabled()) { |
+ main_thread_only().time_domain->ScheduleDelayedWork(this, delayed_run_time, |
+ now); |
} |
TraceQueueSize(false); |
@@ -404,7 +407,8 @@ bool TaskQueueImpl::HasPendingImmediateWork() const { |
} |
base::Optional<base::TimeTicks> TaskQueueImpl::GetNextScheduledWakeUp() { |
- if (main_thread_only().delayed_incoming_queue.empty()) |
+ // Note we don't scheduled a wakeup for disabled queues. |
+ if (main_thread_only().delayed_incoming_queue.empty() || !IsQueueEnabled()) |
return base::nullopt; |
return main_thread_only().delayed_incoming_queue.top().delayed_run_time; |
@@ -581,7 +585,7 @@ void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) { |
main_thread_only().time_domain = time_domain; |
time_domain->RegisterQueue(this); |
- if (!main_thread_only().delayed_incoming_queue.empty()) { |
+ if (IsQueueEnabled() && !main_thread_only().delayed_incoming_queue.empty()) { |
time_domain->ScheduleDelayedWork( |
this, main_thread_only().delayed_incoming_queue.top().delayed_run_time, |
time_domain->Now()); |
@@ -799,10 +803,18 @@ void TaskQueueImpl::EnableOrDisableWithSelector(bool enable) { |
return; |
if (enable) { |
+ if (!main_thread_only().delayed_incoming_queue.empty()) { |
+ main_thread_only().time_domain->ScheduleDelayedWork( |
+ this, |
+ main_thread_only().delayed_incoming_queue.top().delayed_run_time, |
+ main_thread_only().time_domain->Now()); |
+ } |
// Note the selector calls TaskQueueManager::OnTaskQueueEnabled which posts |
// a DoWork if needed. |
main_thread_only().task_queue_manager->selector_.EnableQueue(this); |
} else { |
+ if (!main_thread_only().delayed_incoming_queue.empty()) |
+ main_thread_only().time_domain->CancelDelayedWork(this); |
main_thread_only().task_queue_manager->selector_.DisableQueue(this); |
} |
} |
@@ -838,9 +850,12 @@ void TaskQueueImpl::SweepCanceledDelayedTasks(base::TimeTicks now) { |
main_thread_only().time_domain->CancelDelayedWork(this); |
} else if (first_task_runtime != |
main_thread_only().delayed_incoming_queue.top().delayed_run_time) { |
- main_thread_only().time_domain->ScheduleDelayedWork( |
- this, main_thread_only().delayed_incoming_queue.top().delayed_run_time, |
- main_thread_only().time_domain->Now()); |
+ if (IsQueueEnabled()) { |
+ main_thread_only().time_domain->ScheduleDelayedWork( |
+ this, |
+ main_thread_only().delayed_incoming_queue.top().delayed_run_time, |
+ main_thread_only().time_domain->Now()); |
+ } |
} |
} |