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()); |