| Index: components/scheduler/renderer/throttling_helper.cc
|
| diff --git a/components/scheduler/renderer/throttling_helper.cc b/components/scheduler/renderer/throttling_helper.cc
|
| index c5335bfe91c710acf08ac02155afe7fa14f5ed8c..034a1611ddc14ab34318eb015af2798dc7e76cc4 100644
|
| --- a/components/scheduler/renderer/throttling_helper.cc
|
| +++ b/components/scheduler/renderer/throttling_helper.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/logging.h"
|
| #include "components/scheduler/base/real_time_domain.h"
|
| #include "components/scheduler/child/scheduler_tqm_delegate.h"
|
| +#include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h"
|
| #include "components/scheduler/renderer/renderer_scheduler_impl.h"
|
| #include "components/scheduler/renderer/throttled_time_domain.h"
|
| #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
|
| @@ -21,8 +22,9 @@ ThrottlingHelper::ThrottlingHelper(RendererSchedulerImpl* renderer_scheduler,
|
| tick_clock_(renderer_scheduler->tick_clock()),
|
| tracing_category_(tracing_category),
|
| time_domain_(new ThrottledTimeDomain(this, tracing_category)),
|
| + virtual_time_(false),
|
| weak_factory_(this) {
|
| - suspend_timers_when_backgrounded_closure_.Reset(base::Bind(
|
| + pump_throttled_tasks_closure_.Reset(base::Bind(
|
| &ThrottlingHelper::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
|
| forward_immediate_work_closure_ =
|
| base::Bind(&ThrottlingHelper::OnTimeDomainHasImmediateWork,
|
| @@ -63,6 +65,9 @@ void ThrottlingHelper::SetQueueEnabled(TaskQueue* task_queue, bool enabled) {
|
| void ThrottlingHelper::IncreaseThrottleRefCount(TaskQueue* task_queue) {
|
| DCHECK_NE(task_queue, task_runner_.get());
|
|
|
| + if (virtual_time_)
|
| + return;
|
| +
|
| std::pair<TaskQueueMap::iterator, bool> insert_result =
|
| throttled_queues_.insert(std::make_pair(
|
| task_queue, Metadata(1, task_queue->IsQueueEnabled())));
|
| @@ -87,6 +92,9 @@ void ThrottlingHelper::IncreaseThrottleRefCount(TaskQueue* task_queue) {
|
| }
|
|
|
| void ThrottlingHelper::DecreaseThrottleRefCount(TaskQueue* task_queue) {
|
| + if (virtual_time_)
|
| + return;
|
| +
|
| TaskQueueMap::iterator iter = throttled_queues_.find(task_queue);
|
|
|
| if (iter != throttled_queues_.end() &&
|
| @@ -167,6 +175,9 @@ void ThrottlingHelper::MaybeSchedulePumpThrottledTasksLocked(
|
| const tracked_objects::Location& from_here,
|
| base::TimeTicks now,
|
| base::TimeTicks unthrottled_runtime) {
|
| + if (virtual_time_)
|
| + return;
|
| +
|
| base::TimeTicks throttled_runtime =
|
| ThrottledRunTime(std::max(now, unthrottled_runtime));
|
| // If there is a pending call to PumpThrottledTasks and it's sooner than
|
| @@ -178,14 +189,31 @@ void ThrottlingHelper::MaybeSchedulePumpThrottledTasksLocked(
|
|
|
| pending_pump_throttled_tasks_runtime_ = throttled_runtime;
|
|
|
| - suspend_timers_when_backgrounded_closure_.Cancel();
|
| + pump_throttled_tasks_closure_.Cancel();
|
|
|
| base::TimeDelta delay = pending_pump_throttled_tasks_runtime_ - now;
|
| TRACE_EVENT1(tracing_category_,
|
| "ThrottlingHelper::MaybeSchedulePumpThrottledTasksLocked",
|
| "delay_till_next_pump_ms", delay.InMilliseconds());
|
| task_runner_->PostDelayedTask(
|
| - from_here, suspend_timers_when_backgrounded_closure_.callback(), delay);
|
| + from_here, pump_throttled_tasks_closure_.callback(), delay);
|
| +}
|
| +
|
| +void ThrottlingHelper::EnableVirtualTime() {
|
| + virtual_time_ = true;
|
| +
|
| + pump_throttled_tasks_closure_.Cancel();
|
| +
|
| + while (!throttled_queues_.empty()) {
|
| + TaskQueue* task_queue = throttled_queues_.begin()->first;
|
| + bool enabled = throttled_queues_.begin()->second.enabled;
|
| +
|
| + throttled_queues_.erase(throttled_queues_.begin());
|
| +
|
| + task_queue->SetTimeDomain(renderer_scheduler_->GetVirtualTimeDomain());
|
| + task_queue->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
|
| + task_queue->SetQueueEnabled(enabled);
|
| + }
|
| }
|
|
|
| } // namespace scheduler
|
|
|