| Index: third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc
|
| index 0c68389330d7536300990bcd877a32a3f2acf551..6224516d1464276b49a3fd1dc77376a5751ffaae 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc
|
| @@ -6,32 +6,13 @@
|
|
|
| #include <cstdint>
|
|
|
| -#include "base/format_macros.h"
|
| -#include "base/logging.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/optional.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "platform/WebFrameScheduler.h"
|
| -#include "platform/scheduler/base/real_time_domain.h"
|
| -#include "platform/scheduler/child/scheduler_tqm_delegate.h"
|
| -#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
|
| #include "platform/scheduler/renderer/task_queue_throttler.h"
|
| -#include "platform/scheduler/renderer/throttled_time_domain.h"
|
| -#include "platform/scheduler/renderer/web_frame_scheduler_impl.h"
|
|
|
| namespace blink {
|
| namespace scheduler {
|
|
|
| -namespace {
|
| -
|
| -std::string PointerToId(void* pointer) {
|
| - return base::StringPrintf(
|
| - "0x%" PRIx64,
|
| - static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| BudgetPool::BudgetPool(const char* name,
|
| BudgetPoolController* budget_pool_controller)
|
| : name_(name),
|
| @@ -48,20 +29,27 @@ void BudgetPool::AddQueue(base::TimeTicks now, TaskQueue* queue) {
|
| budget_pool_controller_->AddQueueToBudgetPool(queue, this);
|
| associated_task_queues_.insert(queue);
|
|
|
| - if (!is_enabled_ || !budget_pool_controller_->IsThrottled(queue))
|
| + if (!is_enabled_)
|
| return;
|
| + budget_pool_controller_->UpdateQueueThrottlingState(now, queue);
|
| +}
|
|
|
| - budget_pool_controller_->BlockQueue(now, queue);
|
| +void BudgetPool::UnregisterQueue(TaskQueue* queue) {
|
| + DissociateQueue(queue);
|
| }
|
|
|
| void BudgetPool::RemoveQueue(base::TimeTicks now, TaskQueue* queue) {
|
| - budget_pool_controller_->RemoveQueueFromBudgetPool(queue, this);
|
| - associated_task_queues_.erase(queue);
|
| + DissociateQueue(queue);
|
|
|
| - if (!is_enabled_ || !budget_pool_controller_->IsThrottled(queue))
|
| + if (!is_enabled_)
|
| return;
|
|
|
| - budget_pool_controller_->UnblockQueue(now, queue);
|
| + budget_pool_controller_->UpdateQueueThrottlingState(now, queue);
|
| +}
|
| +
|
| +void BudgetPool::DissociateQueue(TaskQueue* queue) {
|
| + budget_pool_controller_->RemoveQueueFromBudgetPool(queue, this);
|
| + associated_task_queues_.erase(queue);
|
| }
|
|
|
| void BudgetPool::EnableThrottling(LazyNow* lazy_now) {
|
| @@ -82,10 +70,7 @@ void BudgetPool::DisableThrottling(LazyNow* lazy_now) {
|
| TRACE_EVENT0("renderer.scheduler", "BudgetPool_DisableThrottling");
|
|
|
| for (TaskQueue* queue : associated_task_queues_) {
|
| - if (!budget_pool_controller_->IsThrottled(queue))
|
| - continue;
|
| -
|
| - budget_pool_controller_->UnblockQueue(lazy_now->Now(), queue);
|
| + budget_pool_controller_->UpdateQueueThrottlingState(lazy_now->Now(), queue);
|
| }
|
|
|
| // TODO(altimin): We need to disable TimeBudgetQueues here or they will
|
| @@ -104,145 +89,7 @@ void BudgetPool::Close() {
|
|
|
| void BudgetPool::BlockThrottledQueues(base::TimeTicks now) {
|
| for (TaskQueue* queue : associated_task_queues_)
|
| - budget_pool_controller_->BlockQueue(now, queue);
|
| -}
|
| -
|
| -CPUTimeBudgetPool::CPUTimeBudgetPool(
|
| - const char* name,
|
| - BudgetPoolController* budget_pool_controller,
|
| - base::TimeTicks now)
|
| - : BudgetPool(name, budget_pool_controller),
|
| - last_checkpoint_(now),
|
| - cpu_percentage_(1) {}
|
| -
|
| -CPUTimeBudgetPool::~CPUTimeBudgetPool() {}
|
| -
|
| -void CPUTimeBudgetPool::SetMaxBudgetLevel(
|
| - base::TimeTicks now,
|
| - base::Optional<base::TimeDelta> max_budget_level) {
|
| - Advance(now);
|
| - max_budget_level_ = max_budget_level;
|
| - EnforceBudgetLevelRestrictions();
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::SetMaxThrottlingDelay(
|
| - base::TimeTicks now,
|
| - base::Optional<base::TimeDelta> max_throttling_delay) {
|
| - Advance(now);
|
| - max_throttling_delay_ = max_throttling_delay;
|
| - EnforceBudgetLevelRestrictions();
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::SetMinBudgetLevelToRun(
|
| - base::TimeTicks now,
|
| - base::TimeDelta min_budget_level_to_run) {
|
| - Advance(now);
|
| - min_budget_level_to_run_ = min_budget_level_to_run;
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::SetTimeBudgetRecoveryRate(base::TimeTicks now,
|
| - double cpu_percentage) {
|
| - Advance(now);
|
| - cpu_percentage_ = cpu_percentage;
|
| - EnforceBudgetLevelRestrictions();
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::GrantAdditionalBudget(base::TimeTicks now,
|
| - base::TimeDelta budget_level) {
|
| - Advance(now);
|
| - current_budget_level_ += budget_level;
|
| - EnforceBudgetLevelRestrictions();
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::SetReportingCallback(
|
| - base::Callback<void(base::TimeDelta)> reporting_callback) {
|
| - reporting_callback_ = reporting_callback;
|
| -}
|
| -
|
| -bool CPUTimeBudgetPool::HasEnoughBudgetToRun(base::TimeTicks now) {
|
| - return now >= GetNextAllowedRunTime();
|
| -}
|
| -
|
| -base::TimeTicks CPUTimeBudgetPool::GetNextAllowedRunTime() {
|
| - if (!is_enabled_ || current_budget_level_.InMicroseconds() >= 0) {
|
| - return last_checkpoint_;
|
| - } else {
|
| - // Subtract because current_budget is negative.
|
| - return last_checkpoint_ +
|
| - (-current_budget_level_ + min_budget_level_to_run_) /
|
| - cpu_percentage_;
|
| - }
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::RecordTaskRunTime(base::TimeTicks start_time,
|
| - base::TimeTicks end_time) {
|
| - DCHECK_LE(start_time, end_time);
|
| - Advance(end_time);
|
| - if (is_enabled_) {
|
| - base::TimeDelta old_budget_level = current_budget_level_;
|
| - current_budget_level_ -= (end_time - start_time);
|
| - EnforceBudgetLevelRestrictions();
|
| -
|
| - if (!reporting_callback_.is_null() && old_budget_level.InSecondsF() > 0 &&
|
| - current_budget_level_.InSecondsF() < 0) {
|
| - reporting_callback_.Run(-current_budget_level_ / cpu_percentage_);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::AsValueInto(base::trace_event::TracedValue* state,
|
| - base::TimeTicks now) const {
|
| - state->BeginDictionary(name_);
|
| -
|
| - state->SetString("name", name_);
|
| - state->SetDouble("time_budget", cpu_percentage_);
|
| - state->SetDouble("time_budget_level_in_seconds",
|
| - current_budget_level_.InSecondsF());
|
| - state->SetDouble("last_checkpoint_seconds_ago",
|
| - (now - last_checkpoint_).InSecondsF());
|
| - state->SetBoolean("is_enabled", is_enabled_);
|
| - state->SetDouble("min_budget_level_to_run_in_seconds",
|
| - min_budget_level_to_run_.InSecondsF());
|
| -
|
| - if (max_throttling_delay_) {
|
| - state->SetDouble("max_throttling_delay_in_seconds",
|
| - max_throttling_delay_.value().InSecondsF());
|
| - }
|
| - if (max_budget_level_) {
|
| - state->SetDouble("max_budget_level_in_seconds",
|
| - max_budget_level_.value().InSecondsF());
|
| - }
|
| -
|
| - state->BeginArray("task_queues");
|
| - for (TaskQueue* queue : associated_task_queues_) {
|
| - state->AppendString(PointerToId(queue));
|
| - }
|
| - state->EndArray();
|
| -
|
| - state->EndDictionary();
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::Advance(base::TimeTicks now) {
|
| - if (now > last_checkpoint_) {
|
| - if (is_enabled_) {
|
| - current_budget_level_ += cpu_percentage_ * (now - last_checkpoint_);
|
| - EnforceBudgetLevelRestrictions();
|
| - }
|
| - last_checkpoint_ = now;
|
| - }
|
| -}
|
| -
|
| -void CPUTimeBudgetPool::EnforceBudgetLevelRestrictions() {
|
| - if (max_budget_level_) {
|
| - current_budget_level_ =
|
| - std::min(current_budget_level_, max_budget_level_.value());
|
| - }
|
| - if (max_throttling_delay_) {
|
| - // Current budget level may be negative.
|
| - current_budget_level_ =
|
| - std::max(current_budget_level_,
|
| - -max_throttling_delay_.value() * cpu_percentage_);
|
| - }
|
| + budget_pool_controller_->UpdateQueueThrottlingState(now, queue);
|
| }
|
|
|
| } // namespace scheduler
|
|
|