Chromium Code Reviews| Index: content/renderer/scheduler/renderer_scheduler_impl.cc |
| diff --git a/content/renderer/scheduler/renderer_scheduler_impl.cc b/content/renderer/scheduler/renderer_scheduler_impl.cc |
| index 63465ca252087764be22b941a0ca56e0b06a0cb7..0a9696e1ef629bd8d3c60d61d37e227307dd43bc 100644 |
| --- a/content/renderer/scheduler/renderer_scheduler_impl.cc |
| +++ b/content/renderer/scheduler/renderer_scheduler_impl.cc |
| @@ -32,7 +32,7 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
| loading_task_runner_( |
| task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), |
| current_policy_(Policy::NORMAL), |
| - in_idle_period_(false), |
| + idle_period_state_(IdlePeriodState::NOT_WITHIN_IDLE_PERIOD), |
| last_input_type_(blink::WebInputEvent::Undefined), |
| input_stream_state_(InputStreamState::INACTIVE), |
| policy_may_need_update_(&incoming_signals_lock_), |
| @@ -141,7 +141,7 @@ void RendererSchedulerImpl::DidCommitFrameToCompositor() { |
| if (now < estimated_next_frame_begin_) { |
| // TODO(rmcilroy): Consider reducing the idle period based on the runtime of |
| // the next pending delayed tasks (as currently done in for long idle times) |
| - StartIdlePeriod(); |
| + StartIdlePeriod(IdlePeriodState::WITHIN_IDLE_PERIOD); |
| control_task_runner_->PostDelayedTask(FROM_HERE, |
| end_idle_period_closure_.callback(), |
| estimated_next_frame_begin_ - now); |
| @@ -397,7 +397,8 @@ base::TimeDelta RendererSchedulerImpl::TimeLeftInInputEscalatedPolicy() const { |
| return time_left_in_policy; |
| } |
| -bool RendererSchedulerImpl::ShouldStartLongIdlePeriod( |
| +RendererSchedulerImpl::IdlePeriodState |
| +RendererSchedulerImpl::ComputeNewLongIdlePeriodState( |
| const base::TimeTicks now, |
| base::TimeDelta* next_long_idle_period_delay_out) { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| @@ -407,28 +408,32 @@ bool RendererSchedulerImpl::ShouldStartLongIdlePeriod( |
| // Don't start a long idle task in touch start priority, try again when |
| // the policy is scheduled to end. |
| *next_long_idle_period_delay_out = current_policy_expiration_time_ - now; |
| - return false; |
| + return IdlePeriodState::NOT_WITHIN_IDLE_PERIOD; |
| } |
| base::TimeTicks next_pending_delayed_task = |
| task_queue_manager_->NextPendingDelayedTaskRunTime(); |
| - |
| - base::TimeDelta long_idle_period_duration = |
| + base::TimeDelta max_long_idle_period_duration = |
| base::TimeDelta::FromMilliseconds(kMaximumIdlePeriodMillis); |
| + base::TimeDelta long_idle_period_duration; |
| if (!next_pending_delayed_task.is_null()) { |
|
picksi
2015/03/05 12:22:08
It's time for my regular "remove ! and swap if/els
rmcilroy
2015/03/05 13:25:24
Done.
|
| - // Limit the idle period duration to be before the next pending task. |
| - long_idle_period_duration = std::min( |
| - next_pending_delayed_task - now, long_idle_period_duration); |
| + // Limit the idle period duration to be before the next pending task. |
| + long_idle_period_duration = std::min( |
| + next_pending_delayed_task - now, max_long_idle_period_duration); |
| + } else { |
| + long_idle_period_duration = max_long_idle_period_duration; |
| } |
| if (long_idle_period_duration > base::TimeDelta()) { |
| *next_long_idle_period_delay_out = long_idle_period_duration; |
| - return true; |
| + return long_idle_period_duration == max_long_idle_period_duration ? |
|
picksi
2015/03/05 12:22:08
It seems slightly non-intuitive to say we're "with
rmcilroy
2015/03/05 13:25:24
I renamed the states (e.g., IN_LONG_IDLE_WITH_MAX_
|
| + IdlePeriodState::WITHIN_MAX_DEADLINE_IDLE_PERIOD: |
| + IdlePeriodState::WITHIN_IDLE_PERIOD; |
| } else { |
| // If we can't start the idle period yet then try again after wakeup. |
| *next_long_idle_period_delay_out = base::TimeDelta::FromMilliseconds( |
| kRetryInitiateLongIdlePeriodDelayMillis); |
| - return false; |
| + return IdlePeriodState::NOT_WITHIN_IDLE_PERIOD; |
| } |
| } |
| @@ -442,9 +447,11 @@ void RendererSchedulerImpl::InitiateLongIdlePeriod() { |
| base::TimeTicks now(Now()); |
| base::TimeDelta next_long_idle_period_delay; |
| - if (ShouldStartLongIdlePeriod(now, &next_long_idle_period_delay)) { |
| + IdlePeriodState new_idle_period_state = ComputeNewLongIdlePeriodState( |
| + now, &next_long_idle_period_delay); |
| + if (new_idle_period_state != IdlePeriodState::NOT_WITHIN_IDLE_PERIOD) { |
|
picksi
2015/03/05 12:22:08
(More "!" comments)... I find this double negative
rmcilroy
2015/03/05 13:25:24
Done.
|
| estimated_next_frame_begin_ = now + next_long_idle_period_delay; |
| - StartIdlePeriod(); |
| + StartIdlePeriod(new_idle_period_state); |
| } |
| if (task_queue_manager_->IsQueueEmpty(IDLE_TASK_QUEUE)) { |
| @@ -469,7 +476,7 @@ void RendererSchedulerImpl::InitiateLongIdlePeriodAfterWakeup() { |
| "AfterWakeupInitiateLongIdlePeriod"); |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| - if (in_idle_period_) { |
| + if (idle_period_state_ != IdlePeriodState::NOT_WITHIN_IDLE_PERIOD) { |
| // Since we were asleep until now, end the async idle period trace event at |
| // the time when it would have ended were we awake. |
| TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0( |
| @@ -486,14 +493,16 @@ void RendererSchedulerImpl::InitiateLongIdlePeriodAfterWakeup() { |
| initiate_next_long_idle_period_closure_.callback()); |
| } |
| -void RendererSchedulerImpl::StartIdlePeriod() { |
| +void RendererSchedulerImpl::StartIdlePeriod(IdlePeriodState new_state) { |
| TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler", |
| "RendererSchedulerIdlePeriod", this); |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| + // TODO(rmcilroy): Change this to DCHECK_EQ when crbug.com/463869 is fixed. |
| + DCHECK(new_state != IdlePeriodState::NOT_WITHIN_IDLE_PERIOD); |
| + idle_period_state_ = new_state; |
| renderer_task_queue_selector_->EnableQueue( |
| IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); |
| task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE); |
| - in_idle_period_ = true; |
| } |
| void RendererSchedulerImpl::EndIdlePeriod() { |
| @@ -503,9 +512,10 @@ void RendererSchedulerImpl::EndIdlePeriod() { |
| initiate_next_long_idle_period_closure_.Cancel(); |
| initiate_next_long_idle_period_after_wakeup_closure_.Cancel(); |
| - if (!in_idle_period_) |
| + if (idle_period_state_ == IdlePeriodState::NOT_WITHIN_IDLE_PERIOD) |
|
picksi
2015/03/05 12:22:08
Is this a silent failure? Should this be a DCHECK
rmcilroy
2015/03/05 13:25:24
No, it's allowable to call EndIdlePeriod even if y
|
| return; |
| + idle_period_state_ = IdlePeriodState::NOT_WITHIN_IDLE_PERIOD; |
| renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE); |
| bool is_tracing; |
| TRACE_EVENT_CATEGORY_GROUP_ENABLED("renderer.scheduler", &is_tracing); |
| @@ -522,6 +532,10 @@ void RendererSchedulerImpl::EndIdlePeriod() { |
| "RendererSchedulerIdlePeriod", this); |
| } |
| +bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { |
| + return idle_period_state_ == IdlePeriodState::WITHIN_MAX_DEADLINE_IDLE_PERIOD; |
| +} |
| + |
| void RendererSchedulerImpl::SetTimeSourceForTesting( |
| scoped_refptr<cc::TestNowSource> time_source) { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| @@ -607,6 +621,21 @@ const char* RendererSchedulerImpl::InputStreamStateToString( |
| } |
| } |
| +const char* RendererSchedulerImpl::IdlePeriodStateToString( |
| + IdlePeriodState state) { |
|
picksi
2015/03/05 12:22:08
nit: rename state to idle_period_state
rmcilroy
2015/03/05 13:25:24
Done.
|
| + switch (state) { |
| + case IdlePeriodState::NOT_WITHIN_IDLE_PERIOD: |
| + return "not_within_idle_period"; |
| + case IdlePeriodState::WITHIN_IDLE_PERIOD: |
| + return "within_idle_period"; |
| + case IdlePeriodState::WITHIN_MAX_DEADLINE_IDLE_PERIOD: |
| + return "within_max_deadline_idle_period"; |
| + default: |
| + NOTREACHED(); |
| + return nullptr; |
| + } |
| +} |
| + |
| scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| @@ -618,7 +647,8 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
| new base::trace_event::TracedValue(); |
| state->SetString("current_policy", PolicyToString(current_policy_)); |
| - state->SetBoolean("in_idle_period", in_idle_period_); |
| + state->SetString("idle_period_state", |
| + IdlePeriodStateToString(idle_period_state_)); |
| state->SetString("input_stream_state", |
| InputStreamStateToString(input_stream_state_)); |
| state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); |