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

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: Change to exposing a CanExceedIdleDeadlineIfRequired function instead. 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 c105d7749b246842cd0284768a03028825ffbaa4..8f4f076217d74fa463fed02224f01089a54f1842 100644
--- a/content/renderer/scheduler/renderer_scheduler_impl.cc
+++ b/content/renderer/scheduler/renderer_scheduler_impl.cc
@@ -138,7 +138,7 @@ void RendererSchedulerImpl::DidCommitFrameToCompositor() {
base::TimeTicks now(Now());
if (now < estimated_next_frame_begin_) {
- StartIdlePeriod();
+ StartIdlePeriod(IdlePeriodState::WITHIN_IDLE_PERIOD);
control_task_runner_->PostDelayedTask(FROM_HERE,
end_idle_period_closure_.callback(),
estimated_next_frame_begin_ - now);
@@ -394,7 +394,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());
@@ -404,28 +405,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()) {
- // 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 ?
+ 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;
}
}
@@ -439,9 +444,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) {
estimated_next_frame_begin_ = now + next_long_idle_period_delay;
- StartIdlePeriod();
+ StartIdlePeriod(new_idle_period_state);
}
if (task_queue_manager_->IsQueueEmpty(IDLE_TASK_QUEUE)) {
@@ -466,7 +473,7 @@ void RendererSchedulerImpl::InitiateLongIdlePeriodAfterWakeup() {
"AfterWakeupInitiateLongIdlePeriod");
DCHECK(main_thread_checker_.CalledOnValidThread());
- if (in_idle_period_) {
+ if (idle_period_state_ != IdlePeriodState::NOT_WITHIN_IDLE_PERIOD) {
Sami 2015/03/05 11:59:32 Should we still mark the async event as ended here
rmcilroy 2015/03/05 13:50:19 No (for the reasons discussed on the other CL).
// 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(
@@ -483,14 +490,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() {
@@ -500,9 +509,10 @@ void RendererSchedulerImpl::EndIdlePeriod() {
initiate_next_long_idle_period_closure_.Cancel();
after_wakeup_initiate_next_long_idle_period_closure_.Cancel();
- if (!in_idle_period_)
+ if (idle_period_state_ == IdlePeriodState::NOT_WITHIN_IDLE_PERIOD)
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);
@@ -519,6 +529,10 @@ void RendererSchedulerImpl::EndIdlePeriod() {
"RendererSchedulerIdlePeriod", this);
}
+bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const {
+ return idle_period_state_ == IdlePeriodState::WITHIN_MAX_DEADLINE_IDLE_PERIOD;
Sami 2015/03/05 11:59:32 DCHECK(main_thread_checker_.CalledOnValidThread())
rmcilroy 2015/03/05 13:50:19 Done.
+}
+
void RendererSchedulerImpl::SetTimeSourceForTesting(
scoped_refptr<cc::TestNowSource> time_source) {
DCHECK(main_thread_checker_.CalledOnValidThread());

Powered by Google App Engine
This is Rietveld 408576698