| Index: third_party/WebKit/Source/platform/scheduler/renderer/throttling_helper.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/throttling_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/throttling_helper.cc
|
| deleted file mode 100644
|
| index 20ff3a1116f6628a01002daf48055ed181c184e0..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/throttling_helper.cc
|
| +++ /dev/null
|
| @@ -1,225 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "platform/scheduler/renderer/throttling_helper.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "platform/scheduler/base/real_time_domain.h"
|
| -#include "platform/scheduler/child/scheduler_tqm_delegate.h"
|
| -#include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h"
|
| -#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
|
| -#include "platform/scheduler/renderer/throttled_time_domain.h"
|
| -#include "platform/scheduler/renderer/web_frame_scheduler_impl.h"
|
| -#include "public/platform/WebFrameScheduler.h"
|
| -
|
| -namespace blink {
|
| -namespace scheduler {
|
| -
|
| -ThrottlingHelper::ThrottlingHelper(RendererSchedulerImpl* renderer_scheduler,
|
| - const char* tracing_category)
|
| - : task_runner_(renderer_scheduler->ControlTaskRunner()),
|
| - renderer_scheduler_(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) {
|
| - pump_throttled_tasks_closure_.Reset(base::Bind(
|
| - &ThrottlingHelper::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
|
| - forward_immediate_work_closure_ =
|
| - base::Bind(&ThrottlingHelper::OnTimeDomainHasImmediateWork,
|
| - weak_factory_.GetWeakPtr());
|
| -
|
| - renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
|
| -}
|
| -
|
| -ThrottlingHelper::~ThrottlingHelper() {
|
| - // It's possible for queues to be still throttled, so we need to tidy up
|
| - // before unregistering the time domain.
|
| - for (const TaskQueueMap::value_type& map_entry : throttled_queues_) {
|
| - TaskQueue* task_queue = map_entry.first;
|
| - task_queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| - task_queue->RemoveFence();
|
| - }
|
| -
|
| - renderer_scheduler_->UnregisterTimeDomain(time_domain_.get());
|
| -}
|
| -
|
| -void ThrottlingHelper::SetQueueEnabled(TaskQueue* task_queue, bool enabled) {
|
| - TaskQueueMap::iterator find_it = throttled_queues_.find(task_queue);
|
| -
|
| - if (find_it == throttled_queues_.end()) {
|
| - task_queue->SetQueueEnabled(enabled);
|
| - return;
|
| - }
|
| -
|
| - find_it->second.enabled = enabled;
|
| -
|
| - // We don't enable the queue here because it's throttled and there might be
|
| - // tasks in it's work queue that would execute immediatly rather than after
|
| - // PumpThrottledTasks runs.
|
| - if (!enabled)
|
| - task_queue->SetQueueEnabled(false);
|
| -}
|
| -
|
| -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())));
|
| -
|
| - if (insert_result.second) {
|
| - // The insert was succesful so we need to throttle the queue.
|
| - task_queue->SetTimeDomain(time_domain_.get());
|
| - task_queue->RemoveFence();
|
| - task_queue->SetQueueEnabled(false);
|
| -
|
| - if (!task_queue->IsEmpty()) {
|
| - if (task_queue->HasPendingImmediateWork()) {
|
| - OnTimeDomainHasImmediateWork();
|
| - } else {
|
| - OnTimeDomainHasDelayedWork();
|
| - }
|
| - }
|
| - } else {
|
| - // An entry already existed in the map so we need to increment the refcount.
|
| - insert_result.first->second.throttling_ref_count++;
|
| - }
|
| -}
|
| -
|
| -void ThrottlingHelper::DecreaseThrottleRefCount(TaskQueue* task_queue) {
|
| - if (virtual_time_)
|
| - return;
|
| -
|
| - TaskQueueMap::iterator iter = throttled_queues_.find(task_queue);
|
| -
|
| - if (iter != throttled_queues_.end() &&
|
| - --iter->second.throttling_ref_count == 0) {
|
| - bool enabled = iter->second.enabled;
|
| - // The refcount has become zero, we need to unthrottle the queue.
|
| - throttled_queues_.erase(iter);
|
| -
|
| - task_queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| - task_queue->RemoveFence();
|
| - task_queue->SetQueueEnabled(enabled);
|
| - }
|
| -}
|
| -
|
| -bool ThrottlingHelper::IsThrottled(TaskQueue* task_queue) const {
|
| - return throttled_queues_.find(task_queue) != throttled_queues_.end();
|
| -}
|
| -
|
| -void ThrottlingHelper::UnregisterTaskQueue(TaskQueue* task_queue) {
|
| - throttled_queues_.erase(task_queue);
|
| -}
|
| -
|
| -void ThrottlingHelper::OnTimeDomainHasImmediateWork() {
|
| - // Forward to the main thread if called from another thread.
|
| - if (!task_runner_->RunsTasksOnCurrentThread()) {
|
| - task_runner_->PostTask(FROM_HERE, forward_immediate_work_closure_);
|
| - return;
|
| - }
|
| - TRACE_EVENT0(tracing_category_,
|
| - "ThrottlingHelper::OnTimeDomainHasImmediateWork");
|
| - base::TimeTicks now = tick_clock_->NowTicks();
|
| - MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, now, now);
|
| -}
|
| -
|
| -void ThrottlingHelper::OnTimeDomainHasDelayedWork() {
|
| - TRACE_EVENT0(tracing_category_,
|
| - "ThrottlingHelper::OnTimeDomainHasDelayedWork");
|
| - base::TimeTicks next_scheduled_delayed_task;
|
| - bool has_delayed_task =
|
| - time_domain_->NextScheduledRunTime(&next_scheduled_delayed_task);
|
| - DCHECK(has_delayed_task);
|
| - base::TimeTicks now = tick_clock_->NowTicks();
|
| - MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, now,
|
| - next_scheduled_delayed_task);
|
| -}
|
| -
|
| -void ThrottlingHelper::PumpThrottledTasks() {
|
| - TRACE_EVENT0(tracing_category_, "ThrottlingHelper::PumpThrottledTasks");
|
| - pending_pump_throttled_tasks_runtime_ = base::TimeTicks();
|
| -
|
| - LazyNow lazy_low(tick_clock_);
|
| - for (const TaskQueueMap::value_type& map_entry : throttled_queues_) {
|
| - TaskQueue* task_queue = map_entry.first;
|
| - if (!map_entry.second.enabled || task_queue->IsEmpty())
|
| - continue;
|
| -
|
| - task_queue->SetQueueEnabled(true);
|
| - task_queue->InsertFence();
|
| - }
|
| - // Make sure NextScheduledRunTime gives us an up-to date result.
|
| - time_domain_->ClearExpiredWakeups();
|
| -
|
| - base::TimeTicks next_scheduled_delayed_task;
|
| - // Maybe schedule a call to ThrottlingHelper::PumpThrottledTasks if there is
|
| - // a pending delayed task. NOTE posting a non-delayed task in the future will
|
| - // result in ThrottlingHelper::OnTimeDomainHasImmediateWork being called.
|
| - if (time_domain_->NextScheduledRunTime(&next_scheduled_delayed_task)) {
|
| - MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, lazy_low.Now(),
|
| - next_scheduled_delayed_task);
|
| - }
|
| -}
|
| -
|
| -/* static */
|
| -base::TimeTicks ThrottlingHelper::ThrottledRunTime(
|
| - base::TimeTicks unthrottled_runtime) {
|
| - const base::TimeDelta one_second = base::TimeDelta::FromSeconds(1);
|
| - return unthrottled_runtime + one_second -
|
| - ((unthrottled_runtime - base::TimeTicks()) % one_second);
|
| -}
|
| -
|
| -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
|
| - // |unthrottled_runtime| then return.
|
| - if (!pending_pump_throttled_tasks_runtime_.is_null() &&
|
| - throttled_runtime >= pending_pump_throttled_tasks_runtime_) {
|
| - return;
|
| - }
|
| -
|
| - pending_pump_throttled_tasks_runtime_ = throttled_runtime;
|
| -
|
| - 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, 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->RemoveFence();
|
| - task_queue->SetQueueEnabled(enabled);
|
| - }
|
| -}
|
| -
|
| -} // namespace scheduler
|
| -} // namespace blink
|
|
|