| Index: third_party/WebKit/Source/platform/scheduler/renderer/wake_up_budget_pool.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/wake_up_budget_pool.cc b/third_party/WebKit/Source/platform/scheduler/renderer/wake_up_budget_pool.cc
|
| index 9d9274c8875552621d958c3da52c44cc8ab7edb4..ff33a7150864ebcfad90f0668904252392cdf7c8 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/wake_up_budget_pool.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/wake_up_budget_pool.cc
|
| @@ -15,7 +15,8 @@ namespace scheduler {
|
| WakeUpBudgetPool::WakeUpBudgetPool(const char* name,
|
| BudgetPoolController* budget_pool_controller,
|
| base::TimeTicks now)
|
| - : BudgetPool(name, budget_pool_controller), wakeups_per_second_(1) {}
|
| + : BudgetPool(name, budget_pool_controller),
|
| + wake_up_interval_(base::TimeDelta::FromSecondsD(1.0)) {}
|
|
|
| WakeUpBudgetPool::~WakeUpBudgetPool() {}
|
|
|
| @@ -23,12 +24,12 @@ QueueBlockType WakeUpBudgetPool::GetBlockType() const {
|
| return QueueBlockType::kNewTasksOnly;
|
| }
|
|
|
| -void WakeUpBudgetPool::SetWakeUpRate(double wakeups_per_second) {
|
| - wakeups_per_second_ = wakeups_per_second;
|
| +void WakeUpBudgetPool::SetWakeUpRate(double wake_ups_per_second) {
|
| + wake_up_interval_ = base::TimeDelta::FromSecondsD(1 / wake_ups_per_second);
|
| }
|
|
|
| void WakeUpBudgetPool::SetWakeUpDuration(base::TimeDelta duration) {
|
| - wakeup_duration_ = duration;
|
| + wake_up_duration_ = duration;
|
| }
|
|
|
| void WakeUpBudgetPool::RecordTaskRunTime(TaskQueue* queue,
|
| @@ -37,39 +38,42 @@ void WakeUpBudgetPool::RecordTaskRunTime(TaskQueue* queue,
|
| budget_pool_controller_->UpdateQueueThrottlingState(end_time, queue);
|
| }
|
|
|
| -base::Optional<base::TimeTicks> WakeUpBudgetPool::NextWakeUp() const {
|
| - if (!last_wakeup_)
|
| - return base::nullopt;
|
| - // Subtract 1 microsecond to work with time alignment in task queue throttler.
|
| - // This is needed due to alignment mechanism in task queue throttler --
|
| - // whole seconds need to be aligned to the next second to deal with immediate
|
| - // tasks correctly. By subtracting 1 microsecond we ensure that next wakeup
|
| - // gets aligned to a correct time.
|
| - return last_wakeup_.value() +
|
| - base::TimeDelta::FromSeconds(1 / wakeups_per_second_) -
|
| - base::TimeDelta::FromMicroseconds(1);
|
| -}
|
| -
|
| bool WakeUpBudgetPool::CanRunTasksAt(base::TimeTicks moment,
|
| bool is_wake_up) const {
|
| - if (!last_wakeup_)
|
| + if (!last_wake_up_)
|
| return false;
|
| // |is_wake_up| flag means that we're in the beginning of the wake-up and
|
| // |OnWakeUp| has just been called. This is needed to support backwards
|
| - // compability with old throttling mechanism (when |wakeup_duration| is zero)
|
| + // compability with old throttling mechanism (when |wake_up_duration| is zero)
|
| // and allow only one task to run.
|
| - if (last_wakeup_ == moment && is_wake_up)
|
| + if (last_wake_up_ == moment && is_wake_up)
|
| return true;
|
| - return moment < last_wakeup_.value() + wakeup_duration_;
|
| + return moment < last_wake_up_.value() + wake_up_duration_;
|
| +}
|
| +
|
| +namespace {
|
| +
|
| +// Wrapper around base::TimeTicks::SnappedToNextTick which ensures that
|
| +// the returned point is strictly in the future.
|
| +base::TimeTicks SnapToNextTickStrict(base::TimeTicks moment,
|
| + base::TimeDelta interval) {
|
| + base::TimeTicks snapped =
|
| + moment.SnappedToNextTick(base::TimeTicks(), interval);
|
| + if (snapped == moment)
|
| + return moment + interval;
|
| + return snapped;
|
| }
|
|
|
| +} // namespace
|
| +
|
| base::TimeTicks WakeUpBudgetPool::GetNextAllowedRunTime(
|
| base::TimeTicks desired_run_time) const {
|
| - if (!last_wakeup_)
|
| - return desired_run_time;
|
| - if (desired_run_time < last_wakeup_.value() + wakeup_duration_)
|
| + if (!last_wake_up_)
|
| + return SnapToNextTickStrict(desired_run_time, wake_up_interval_);
|
| + if (desired_run_time < last_wake_up_.value() + wake_up_duration_)
|
| return desired_run_time;
|
| - return std::max(desired_run_time, NextWakeUp().value());
|
| + return SnapToNextTickStrict(std::max(desired_run_time, last_wake_up_.value()),
|
| + wake_up_interval_);
|
| }
|
|
|
| void WakeUpBudgetPool::OnQueueNextWakeUpChanged(
|
| @@ -80,7 +84,7 @@ void WakeUpBudgetPool::OnQueueNextWakeUpChanged(
|
| }
|
|
|
| void WakeUpBudgetPool::OnWakeUp(base::TimeTicks now) {
|
| - last_wakeup_ = now;
|
| + last_wake_up_ = now;
|
| }
|
|
|
| void WakeUpBudgetPool::AsValueInto(base::trace_event::TracedValue* state,
|
| @@ -88,11 +92,13 @@ void WakeUpBudgetPool::AsValueInto(base::trace_event::TracedValue* state,
|
| state->BeginDictionary(name_);
|
|
|
| state->SetString("name", name_);
|
| - state->SetDouble("wakeups_per_second_rate", wakeups_per_second_);
|
| - state->SetDouble("wakeup_duration_in_seconds", wakeup_duration_.InSecondsF());
|
| - if (last_wakeup_) {
|
| - state->SetDouble("last_wakeup_seconds_ago",
|
| - (now - last_wakeup_.value()).InSecondsF());
|
| + state->SetDouble("wake_up_interval_in_seconds",
|
| + wake_up_interval_.InSecondsF());
|
| + state->SetDouble("wake_up_duration_in_seconds",
|
| + wake_up_duration_.InSecondsF());
|
| + if (last_wake_up_) {
|
| + state->SetDouble("last_wake_up_seconds_ago",
|
| + (now - last_wake_up_.value()).InSecondsF());
|
| }
|
| state->SetBoolean("is_enabled", is_enabled_);
|
|
|
|
|