Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2185)

Unified Diff: content/renderer/scheduler/renderer_scheduler_impl.cc

Issue 969373002: [content]: Add CanExceedIdleDeadlineIfRequired function to RendererScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@long_idle_5
Patch Set: Sync with changes to long-idle CL. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
« no previous file with comments | « content/renderer/scheduler/renderer_scheduler_impl.h ('k') | content/renderer/scheduler/renderer_scheduler_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698