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

Side by Side Diff: components/scheduler/renderer/throttling_helper.cc

Issue 2155143002: Fix a bug that could occasionaly cause setInterval to stop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ClearExpiredWakeups tweak. Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/scheduler/renderer/throttling_helper.h" 5 #include "components/scheduler/renderer/throttling_helper.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "components/scheduler/base/real_time_domain.h" 8 #include "components/scheduler/base/real_time_domain.h"
9 #include "components/scheduler/child/scheduler_tqm_delegate.h" 9 #include "components/scheduler/child/scheduler_tqm_delegate.h"
10 #include "components/scheduler/renderer/renderer_scheduler_impl.h" 10 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
11 #include "components/scheduler/renderer/throttled_time_domain.h" 11 #include "components/scheduler/renderer/throttled_time_domain.h"
12 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" 12 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
13 #include "third_party/WebKit/public/platform/WebFrameScheduler.h" 13 #include "third_party/WebKit/public/platform/WebFrameScheduler.h"
14 14
15 namespace scheduler { 15 namespace scheduler {
16 16
17 ThrottlingHelper::ThrottlingHelper(RendererSchedulerImpl* renderer_scheduler, 17 ThrottlingHelper::ThrottlingHelper(RendererSchedulerImpl* renderer_scheduler,
18 const char* tracing_category) 18 const char* tracing_category)
19 : task_runner_(renderer_scheduler->ControlTaskRunner()), 19 : task_runner_(renderer_scheduler->ControlTaskRunner()),
20 renderer_scheduler_(renderer_scheduler), 20 renderer_scheduler_(renderer_scheduler),
21 tick_clock_(renderer_scheduler->tick_clock()), 21 tick_clock_(renderer_scheduler->tick_clock()),
22 tracing_category_(tracing_category), 22 tracing_category_(tracing_category),
23 time_domain_(new ThrottledTimeDomain(this, tick_clock_)), 23 time_domain_(new ThrottledTimeDomain(this, tracing_category)),
24 weak_factory_(this) { 24 weak_factory_(this) {
25 suspend_timers_when_backgrounded_closure_.Reset(base::Bind( 25 suspend_timers_when_backgrounded_closure_.Reset(base::Bind(
26 &ThrottlingHelper::PumpThrottledTasks, weak_factory_.GetWeakPtr())); 26 &ThrottlingHelper::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
27 forward_immediate_work_closure_ = 27 forward_immediate_work_closure_ =
28 base::Bind(&ThrottlingHelper::OnTimeDomainHasImmediateWork, 28 base::Bind(&ThrottlingHelper::OnTimeDomainHasImmediateWork,
29 weak_factory_.GetWeakPtr()); 29 weak_factory_.GetWeakPtr());
30 30
31 renderer_scheduler_->RegisterTimeDomain(time_domain_.get()); 31 renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
32 } 32 }
33 33
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 DCHECK(has_delayed_task); 126 DCHECK(has_delayed_task);
127 base::TimeTicks now = tick_clock_->NowTicks(); 127 base::TimeTicks now = tick_clock_->NowTicks();
128 MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, now, 128 MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, now,
129 next_scheduled_delayed_task); 129 next_scheduled_delayed_task);
130 } 130 }
131 131
132 void ThrottlingHelper::PumpThrottledTasks() { 132 void ThrottlingHelper::PumpThrottledTasks() {
133 TRACE_EVENT0(tracing_category_, "ThrottlingHelper::PumpThrottledTasks"); 133 TRACE_EVENT0(tracing_category_, "ThrottlingHelper::PumpThrottledTasks");
134 pending_pump_throttled_tasks_runtime_ = base::TimeTicks(); 134 pending_pump_throttled_tasks_runtime_ = base::TimeTicks();
135 135
136 base::TimeTicks now = tick_clock_->NowTicks(); 136 LazyNow lazy_low(tick_clock_);
137 time_domain_->AdvanceTo(now);
138 for (const TaskQueueMap::value_type& map_entry : throttled_queues_) { 137 for (const TaskQueueMap::value_type& map_entry : throttled_queues_) {
139 TaskQueue* task_queue = map_entry.first; 138 TaskQueue* task_queue = map_entry.first;
140 if (task_queue->IsEmpty()) 139 if (task_queue->IsEmpty())
141 continue; 140 continue;
142 141
143 task_queue->SetQueueEnabled(map_entry.second.enabled); 142 task_queue->SetQueueEnabled(map_entry.second.enabled);
144 task_queue->PumpQueue(false); 143 task_queue->PumpQueue(&lazy_low, false);
145 } 144 }
146 // Make sure NextScheduledRunTime gives us an up-to date result. 145 // Make sure NextScheduledRunTime gives us an up-to date result.
147 time_domain_->ClearExpiredWakeups(); 146 time_domain_->ClearExpiredWakeups();
148 147
149 base::TimeTicks next_scheduled_delayed_task; 148 base::TimeTicks next_scheduled_delayed_task;
150 // Maybe schedule a call to ThrottlingHelper::PumpThrottledTasks if there is 149 // Maybe schedule a call to ThrottlingHelper::PumpThrottledTasks if there is
151 // a pending delayed task. NOTE posting a non-delayed task in the future will 150 // a pending delayed task. NOTE posting a non-delayed task in the future will
152 // result in ThrottlingHelper::OnTimeDomainHasImmediateWork being called. 151 // result in ThrottlingHelper::OnTimeDomainHasImmediateWork being called.
153 if (time_domain_->NextScheduledRunTime(&next_scheduled_delayed_task)) { 152 if (time_domain_->NextScheduledRunTime(&next_scheduled_delayed_task)) {
154 MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, now, 153 MaybeSchedulePumpThrottledTasksLocked(FROM_HERE, lazy_low.Now(),
155 next_scheduled_delayed_task); 154 next_scheduled_delayed_task);
156 } 155 }
157 } 156 }
158 157
159 /* static */ 158 /* static */
160 base::TimeTicks ThrottlingHelper::ThrottledRunTime( 159 base::TimeTicks ThrottlingHelper::ThrottledRunTime(
161 base::TimeTicks unthrottled_runtime) { 160 base::TimeTicks unthrottled_runtime) {
162 const base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); 161 const base::TimeDelta one_second = base::TimeDelta::FromSeconds(1);
163 return unthrottled_runtime + one_second - 162 return unthrottled_runtime + one_second -
164 ((unthrottled_runtime - base::TimeTicks()) % one_second); 163 ((unthrottled_runtime - base::TimeTicks()) % one_second);
(...skipping 18 matching lines...) Expand all
183 182
184 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_ - now; 183 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_ - now;
185 TRACE_EVENT1(tracing_category_, 184 TRACE_EVENT1(tracing_category_,
186 "ThrottlingHelper::MaybeSchedulePumpThrottledTasksLocked", 185 "ThrottlingHelper::MaybeSchedulePumpThrottledTasksLocked",
187 "delay_till_next_pump_ms", delay.InMilliseconds()); 186 "delay_till_next_pump_ms", delay.InMilliseconds());
188 task_runner_->PostDelayedTask( 187 task_runner_->PostDelayedTask(
189 from_here, suspend_timers_when_backgrounded_closure_.callback(), delay); 188 from_here, suspend_timers_when_backgrounded_closure_.callback(), delay);
190 } 189 }
191 190
192 } // namespace scheduler 191 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/renderer/throttled_time_domain.cc ('k') | components/scheduler/renderer/throttling_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698