Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc |
| index 983142792b38b9f993ef878f83666d6a545d1c7a..1c93893b1d63692c424fff73dbe0d3741997adf7 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc |
| @@ -6,6 +6,8 @@ |
| #include <cstdint> |
| +#include <iostream> // FIXME |
| + |
| #include "base/format_macros.h" |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| @@ -23,7 +25,9 @@ namespace blink { |
| namespace scheduler { |
| namespace { |
| -const int kMaxBudgetLevelInSeconds = 1; |
| +constexpr base::TimeDelta kMaxBudgetLevel = base::TimeDelta::FromSeconds(1); |
| +constexpr base::TimeDelta kMaxThrottlingDuration = |
| + base::TimeDelta::FromMinutes(1); |
| base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now, |
| TaskQueue* queue) { |
| @@ -70,10 +74,13 @@ base::Optional<T> Max(const base::Optional<T>& a, const base::Optional<T>& b) { |
| TaskQueueThrottler::TimeBudgetPool::TimeBudgetPool( |
| const char* name, |
| TaskQueueThrottler* task_queue_throttler, |
| - base::TimeTicks now) |
| + base::TimeTicks now, |
| + base::Optional<base::TimeDelta> max_budget_level, |
| + base::Optional<base::TimeDelta> max_throttling_duration) |
| : name_(name), |
| task_queue_throttler_(task_queue_throttler), |
| - max_budget_level_(base::TimeDelta::FromSeconds(kMaxBudgetLevelInSeconds)), |
| + max_budget_level_(max_budget_level), |
| + max_throttling_duration_(max_throttling_duration), |
| last_checkpoint_(now), |
| cpu_percentage_(1), |
| is_enabled_(true) {} |
| @@ -84,6 +91,7 @@ void TaskQueueThrottler::TimeBudgetPool::SetTimeBudget(base::TimeTicks now, |
| double cpu_percentage) { |
| Advance(now); |
| cpu_percentage_ = cpu_percentage; |
| + EnforceMaximalThrottlingDuration(); |
| } |
| void TaskQueueThrottler::TimeBudgetPool::AddQueue(base::TimeTicks now, |
| @@ -172,9 +180,13 @@ base::TimeTicks TaskQueueThrottler::TimeBudgetPool::GetNextAllowedRunTime() { |
| } |
| void TaskQueueThrottler::TimeBudgetPool::RecordTaskRunTime( |
| - base::TimeDelta task_run_time) { |
| - if (is_enabled_) |
| - current_budget_level_ -= task_run_time; |
| + base::TimeTicks start_time, |
| + base::TimeTicks end_time) { |
| + Advance(end_time); |
|
alex clarke (OOO till 29th)
2016/10/14 16:37:22
Maybe DCHECK_LE(start_time, end_time);
altimin
2016/10/17 10:48:37
Done.
|
| + if (is_enabled_) { |
| + current_budget_level_ -= (end_time - start_time); |
| + EnforceMaximalThrottlingDuration(); |
| + } |
| } |
| const char* TaskQueueThrottler::TimeBudgetPool::Name() const { |
| @@ -206,9 +218,11 @@ void TaskQueueThrottler::TimeBudgetPool::AsValueInto( |
| void TaskQueueThrottler::TimeBudgetPool::Advance(base::TimeTicks now) { |
| if (now > last_checkpoint_) { |
| if (is_enabled_) { |
| - current_budget_level_ = std::min( |
| - current_budget_level_ + cpu_percentage_ * (now - last_checkpoint_), |
| - max_budget_level_); |
| + current_budget_level_ += cpu_percentage_ * (now - last_checkpoint_); |
| + if (max_budget_level_) { |
| + current_budget_level_ = |
| + std::min(current_budget_level_, max_budget_level_.value()); |
| + } |
| } |
| last_checkpoint_ = now; |
| } |
| @@ -226,6 +240,14 @@ void TaskQueueThrottler::TimeBudgetPool::BlockThrottledQueues( |
| } |
| } |
| +void TaskQueueThrottler::TimeBudgetPool::EnforceMaximalThrottlingDuration() { |
|
alex clarke (OOO till 29th)
2016/10/14 16:37:22
Out of curiosity would it make sense to enforce ma
altimin
2016/10/17 10:48:37
Thanks! Done.
|
| + if (max_throttling_duration_) { |
| + current_budget_level_ = |
| + std::max(current_budget_level_, |
|
alex clarke (OOO till 29th)
2016/10/14 16:37:22
Maybe add a comment pointing out the obvious: curr
altimin
2016/10/17 10:48:37
Done.
|
| + -max_throttling_duration_.value() * cpu_percentage_); |
| + } |
| +} |
| + |
| TaskQueueThrottler::TaskQueueThrottler( |
| RendererSchedulerImpl* renderer_scheduler, |
| const char* tracing_category) |
| @@ -234,6 +256,8 @@ TaskQueueThrottler::TaskQueueThrottler( |
| tick_clock_(renderer_scheduler->tick_clock()), |
| tracing_category_(tracing_category), |
| time_domain_(new ThrottledTimeDomain(this, tracing_category)), |
| + max_budget_level_(kMaxBudgetLevel), |
| + max_throttling_duration_(kMaxThrottlingDuration), |
| virtual_time_(false), |
| weak_factory_(this) { |
| pump_throttled_tasks_closure_.Reset(base::Bind( |
| @@ -503,7 +527,8 @@ void TaskQueueThrottler::EnableVirtualTime() { |
| TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool( |
| const char* name) { |
| TimeBudgetPool* time_budget_pool = |
| - new TimeBudgetPool(name, this, tick_clock_->NowTicks()); |
| + new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level_, |
| + max_throttling_duration_); |
| time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); |
| return time_budget_pool; |
| } |
| @@ -518,7 +543,7 @@ void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue, |
| if (!time_budget_pool) |
| return; |
| - time_budget_pool->RecordTaskRunTime(end_time - start_time); |
| + time_budget_pool->RecordTaskRunTime(start_time, end_time); |
| if (!time_budget_pool->HasEnoughBudgetToRun(end_time)) |
| time_budget_pool->BlockThrottledQueues(end_time); |
| } |