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