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

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

Issue 994833003: Prevent multiple pending UpdatePolicy tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactored Created 5 years, 9 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 6f7821690393a3b8c61b9956f28deb523e766a6b..da26e8b64f555cfa4d2b9b6e90af76bcee7c4cbc 100644
--- a/content/renderer/scheduler/renderer_scheduler_impl.cc
+++ b/content/renderer/scheduler/renderer_scheduler_impl.cc
@@ -35,10 +35,14 @@ RendererSchedulerImpl::RendererSchedulerImpl(
last_input_type_(blink::WebInputEvent::Undefined),
input_stream_state_(InputStreamState::INACTIVE),
policy_may_need_update_(&incoming_signals_lock_),
+ pending_delayed_policy_update_(false),
weak_factory_(this) {
weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr();
update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
weak_renderer_scheduler_ptr_);
+ delayed_update_policy_closure_ =
+ base::Bind(&RendererSchedulerImpl::DelayedPolicyUpdateTask,
+ weak_renderer_scheduler_ptr_);
end_idle_period_closure_.Reset(base::Bind(
&RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_));
idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner(
@@ -185,8 +189,7 @@ void RendererSchedulerImpl::UpdateForInputEvent(
if (input_stream_state_ != new_input_stream_state) {
// Update scheduler policy if we should start a new policy mode.
input_stream_state_ = new_input_stream_state;
- policy_may_need_update_.SetWhileLocked(true);
- PostUpdatePolicyOnControlRunner(base::TimeDelta());
+ ScheduleUrgentPolicyUpdate(FROM_HERE);
}
last_input_receipt_time_on_compositor_ = Now();
// Clear the last known input processing time so that we know an input event
@@ -208,7 +211,7 @@ void RendererSchedulerImpl::DidProcessInputEvent(
begin_frame_time < last_input_receipt_time_on_compositor_)
return;
last_input_process_time_on_main_ = Now();
- policy_may_need_update_.SetWhileLocked(true);
+ UpdatePolicyLocked();
Sami 2015/03/11 16:58:25 Could you add a DCHECK that this function is only
alex clarke (OOO till 29th) 2015/03/12 13:41:31 Done.
}
bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() {
@@ -268,25 +271,50 @@ void RendererSchedulerImpl::MaybeUpdatePolicy() {
}
}
-void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner(
+void RendererSchedulerImpl::ScheduleUrgentPolicyUpdate(
rmcilroy 2015/03/11 17:15:07 nit on naming - how about PostUpdatePolicyToMainTh
alex clarke (OOO till 29th) 2015/03/12 13:41:31 I like the OnMainThread, but it doesn't always pos
+ const tracked_objects::Location& from_here) {
+ incoming_signals_lock_.AssertAcquired();
Sami 2015/03/11 16:58:25 Maybe add a DCHECK() that this is never called on
rmcilroy 2015/03/11 17:15:07 It feels like this would make it easy to introduce
alex clarke (OOO till 29th) 2015/03/12 13:41:31 In principle this is a good idea, but it makes tes
alex clarke (OOO till 29th) 2015/03/12 13:41:31 The de-duping for ScheduleDelayedPolicyUpdate is s
+ if (!policy_may_need_update_.IsSet()) {
+ policy_may_need_update_.SetWhileLocked(true);
+ control_task_runner_->PostTask(from_here, update_policy_closure_);
+ }
+}
+
+void RendererSchedulerImpl::ScheduleDelayedPolicyUpdate(
+ const tracked_objects::Location& from_here,
base::TimeDelta delay) {
- control_task_runner_->PostDelayedTask(
- FROM_HERE, update_policy_closure_, delay);
+ incoming_signals_lock_.AssertAcquired();
Sami 2015/03/11 16:58:25 I think this is probably flexible enough for now,
alex clarke (OOO till 29th) 2015/03/12 13:41:31 I ended up adding a DeadlineTaskRunner that should
+ if (!pending_delayed_policy_update_) {
+ pending_delayed_policy_update_ = true;
+ control_task_runner_->PostDelayedTask(
+ from_here, delayed_update_policy_closure_, delay);
+ }
+}
+
+void RendererSchedulerImpl::DelayedPolicyUpdateTask() {
+ base::AutoLock lock(incoming_signals_lock_);
+ pending_delayed_policy_update_ = false;
+ UpdatePolicyLocked();
}
void RendererSchedulerImpl::UpdatePolicy() {
+ base::AutoLock lock(incoming_signals_lock_);
+ UpdatePolicyLocked();
+}
+
+void RendererSchedulerImpl::UpdatePolicyLocked() {
DCHECK(main_thread_checker_.CalledOnValidThread());
+ incoming_signals_lock_.AssertAcquired();
if (!task_queue_manager_)
return;
- base::AutoLock lock(incoming_signals_lock_);
base::TimeTicks now;
policy_may_need_update_.SetWhileLocked(false);
base::TimeDelta new_policy_duration;
Policy new_policy = ComputeNewPolicy(&new_policy_duration);
if (new_policy_duration > base::TimeDelta())
- PostUpdatePolicyOnControlRunner(new_policy_duration);
+ ScheduleDelayedPolicyUpdate(FROM_HERE, new_policy_duration);
if (new_policy == current_policy_)
return;

Powered by Google App Engine
This is Rietveld 408576698