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

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: Tweak 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..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;

Powered by Google App Engine
This is Rietveld 408576698