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..1d4264df8b1ba2d5a2f4a2cd66d9a420af4f6448 100644 |
--- a/content/renderer/scheduler/renderer_scheduler_impl.cc |
+++ b/content/renderer/scheduler/renderer_scheduler_impl.cc |
@@ -31,6 +31,7 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), |
loading_task_runner_( |
task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), |
+ pending_non_delayed_update_policy_(false), |
current_policy_(Policy::NORMAL), |
last_input_type_(blink::WebInputEvent::Undefined), |
input_stream_state_(InputStreamState::INACTIVE), |
@@ -38,9 +39,12 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
weak_factory_(this) { |
weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); |
update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
- weak_renderer_scheduler_ptr_); |
+ weak_renderer_scheduler_ptr_, true); |
end_idle_period_closure_.Reset(base::Bind( |
&RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); |
+ delayed_update_policy_closure_.Reset( |
+ base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
+ weak_renderer_scheduler_ptr_, false)); |
idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( |
task_queue_manager_->TaskRunnerForQueue(IDLE_TASK_QUEUE), |
control_task_after_wakeup_runner_, |
@@ -186,7 +190,7 @@ void RendererSchedulerImpl::UpdateForInputEvent( |
// 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()); |
+ PostUpdatePolicyOnControlRunnerLocked(base::TimeDelta()); |
} |
last_input_receipt_time_on_compositor_ = Now(); |
// Clear the last known input processing time so that we know an input event |
@@ -264,17 +268,30 @@ RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { |
void RendererSchedulerImpl::MaybeUpdatePolicy() { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
if (policy_may_need_update_.IsSet()) { |
- UpdatePolicy(); |
+ UpdatePolicy(false); |
} |
} |
-void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner( |
+void RendererSchedulerImpl::PostUpdatePolicyOnControlRunnerLocked( |
base::TimeDelta delay) { |
- control_task_runner_->PostDelayedTask( |
- FROM_HERE, update_policy_closure_, delay); |
+ incoming_signals_lock_.AssertAcquired(); |
+ if (delay > base::TimeDelta()) { |
+ // Only allow one pending delayed UpdatePolicy task. |
+ delayed_update_policy_closure_.Cancel(); |
+ control_task_runner_->PostDelayedTask( |
+ FROM_HERE, delayed_update_policy_closure_.callback(), delay); |
+ } else { |
+ // Only allow one pending non-delayed UpdatePolicy task. |
+ if (!pending_non_delayed_update_policy_) { |
+ pending_non_delayed_update_policy_ = true; |
+ control_task_runner_->PostDelayedTask(FROM_HERE, update_policy_closure_, |
+ base::TimeDelta()); |
+ } |
+ } |
} |
-void RendererSchedulerImpl::UpdatePolicy() { |
+void RendererSchedulerImpl::UpdatePolicy( |
+ bool clear_pending_non_delayed_update_policy) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
if (!task_queue_manager_) |
return; |
@@ -282,11 +299,13 @@ void RendererSchedulerImpl::UpdatePolicy() { |
base::AutoLock lock(incoming_signals_lock_); |
base::TimeTicks now; |
policy_may_need_update_.SetWhileLocked(false); |
+ if (clear_pending_non_delayed_update_policy) |
+ pending_non_delayed_update_policy_ = false; |
rmcilroy
2015/03/10 16:08:39
I don't think the pending_non_delayed_update_polic
Sami
2015/03/10 16:19:38
Yeah, I'm all for simplicity too. I was thinking w
alex clarke (OOO till 29th)
2015/03/10 16:21:41
Currently they only get sent when the input_stream
|
base::TimeDelta new_policy_duration; |
Policy new_policy = ComputeNewPolicy(&new_policy_duration); |
if (new_policy_duration > base::TimeDelta()) |
- PostUpdatePolicyOnControlRunner(new_policy_duration); |
+ PostUpdatePolicyOnControlRunnerLocked(new_policy_duration); |
if (new_policy == current_policy_) |
return; |