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

Side by Side Diff: components/scheduler/child/idle_helper.cc

Issue 1151353003: [scheduler]: Avoid waking up the scheduler to end long idle periods. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@end_idle_sync_2
Patch Set: Review comments. Created 5 years, 6 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/child/idle_helper.h" 5 #include "components/scheduler/child/idle_helper.h"
6 6
7 #include "base/trace_event/trace_event.h" 7 #include "base/trace_event/trace_event.h"
8 #include "base/trace_event/trace_event_argument.h" 8 #include "base/trace_event/trace_event_argument.h"
9 #include "components/scheduler/child/scheduler_helper.h" 9 #include "components/scheduler/child/scheduler_helper.h"
10 10
11 namespace scheduler { 11 namespace scheduler {
12 12
13 IdleHelper::IdleHelper( 13 IdleHelper::IdleHelper(
14 SchedulerHelper* helper, 14 SchedulerHelper* helper,
15 Delegate* delegate, 15 Delegate* delegate,
16 size_t idle_queue_index, 16 size_t idle_queue_index,
17 const char* tracing_category, 17 const char* tracing_category,
18 const char* disabled_by_default_tracing_category, 18 const char* disabled_by_default_tracing_category,
19 const char* idle_period_tracing_name, 19 const char* idle_period_tracing_name,
20 base::TimeDelta required_quiescence_duration_before_long_idle_period) 20 base::TimeDelta required_quiescence_duration_before_long_idle_period)
21 : helper_(helper), 21 : helper_(helper),
22 delegate_(delegate), 22 delegate_(delegate),
23 idle_queue_index_(idle_queue_index), 23 idle_queue_index_(idle_queue_index),
24 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), 24 state_(helper,
25 tracing_category,
26 disabled_by_default_tracing_category,
27 idle_period_tracing_name),
25 quiescence_monitored_task_queue_mask_( 28 quiescence_monitored_task_queue_mask_(
26 helper_->GetQuiescenceMonitoredTaskQueueMask() & 29 helper_->GetQuiescenceMonitoredTaskQueueMask() &
27 ~(1ull << idle_queue_index_)), 30 ~(1ull << idle_queue_index_)),
28 required_quiescence_duration_before_long_idle_period_( 31 required_quiescence_duration_before_long_idle_period_(
29 required_quiescence_duration_before_long_idle_period), 32 required_quiescence_duration_before_long_idle_period),
30 tracing_category_(tracing_category),
31 disabled_by_default_tracing_category_( 33 disabled_by_default_tracing_category_(
32 disabled_by_default_tracing_category), 34 disabled_by_default_tracing_category),
33 idle_period_tracing_name_(idle_period_tracing_name),
34 weak_factory_(this) { 35 weak_factory_(this) {
35 weak_idle_helper_ptr_ = weak_factory_.GetWeakPtr(); 36 weak_idle_helper_ptr_ = weak_factory_.GetWeakPtr();
36 end_idle_period_closure_.Reset(
37 base::Bind(&IdleHelper::EndIdlePeriod, weak_idle_helper_ptr_));
38 enable_next_long_idle_period_closure_.Reset( 37 enable_next_long_idle_period_closure_.Reset(
39 base::Bind(&IdleHelper::EnableLongIdlePeriod, weak_idle_helper_ptr_)); 38 base::Bind(&IdleHelper::EnableLongIdlePeriod, weak_idle_helper_ptr_));
40 enable_next_long_idle_period_after_wakeup_closure_.Reset(base::Bind(
41 &IdleHelper::EnableLongIdlePeriodAfterWakeup, weak_idle_helper_ptr_));
42 39
43 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( 40 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner(
44 helper_->TaskRunnerForQueue(idle_queue_index_), 41 helper_->TaskRunnerForQueue(idle_queue_index_),
45 helper_->ControlAfterWakeUpTaskRunner(), 42 helper_->ControlAfterWakeUpTaskRunner(), this, tracing_category));
46 base::Bind(&IdleHelper::CurrentIdleTaskDeadlineCallback,
47 weak_idle_helper_ptr_),
48 tracing_category));
49 43
50 helper_->DisableQueue(idle_queue_index_); 44 helper_->DisableQueue(idle_queue_index_);
51 helper_->SetPumpPolicy(idle_queue_index_, 45 helper_->SetPumpPolicy(idle_queue_index_,
52 TaskQueueManager::PumpPolicy::MANUAL); 46 TaskQueueManager::PumpPolicy::MANUAL);
47
48 helper_->AddTaskObserver(this);
Sami 2015/05/29 09:38:06 Please also remove this in the destructor.
rmcilroy 2015/06/01 15:33:22 Done.
53 } 49 }
54 50
55 IdleHelper::~IdleHelper() { 51 IdleHelper::~IdleHelper() {
56 } 52 }
57 53
58 IdleHelper::Delegate::Delegate() { 54 IdleHelper::Delegate::Delegate() {
59 } 55 }
60 56
61 IdleHelper::Delegate::~Delegate() { 57 IdleHelper::Delegate::~Delegate() {
62 } 58 }
63 59
64 scoped_refptr<SingleThreadIdleTaskRunner> IdleHelper::IdleTaskRunner() { 60 scoped_refptr<SingleThreadIdleTaskRunner> IdleHelper::IdleTaskRunner() {
65 helper_->CheckOnValidThread(); 61 helper_->CheckOnValidThread();
66 return idle_task_runner_; 62 return idle_task_runner_;
67 } 63 }
68 64
69 void IdleHelper::CurrentIdleTaskDeadlineCallback(
70 base::TimeTicks* deadline_out) const {
71 helper_->CheckOnValidThread();
72 *deadline_out = idle_period_deadline_;
73 }
74
75 IdleHelper::IdlePeriodState IdleHelper::ComputeNewLongIdlePeriodState( 65 IdleHelper::IdlePeriodState IdleHelper::ComputeNewLongIdlePeriodState(
76 const base::TimeTicks now, 66 const base::TimeTicks now,
77 base::TimeDelta* next_long_idle_period_delay_out) { 67 base::TimeDelta* next_long_idle_period_delay_out) {
78 helper_->CheckOnValidThread(); 68 helper_->CheckOnValidThread();
79 69
80 if (!delegate_->CanEnterLongIdlePeriod(now, 70 if (!delegate_->CanEnterLongIdlePeriod(now,
81 next_long_idle_period_delay_out)) { 71 next_long_idle_period_delay_out)) {
82 return IdlePeriodState::NOT_IN_IDLE_PERIOD; 72 return IdlePeriodState::NOT_IN_IDLE_PERIOD;
83 } 73 }
84 74
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 task_queues_run_since_last_check_bitmap); 117 task_queues_run_since_last_check_bitmap);
128 118
129 // If anything was run on the queues we care about, then we're not quiescent 119 // If anything was run on the queues we care about, then we're not quiescent
130 // and we should wait. 120 // and we should wait.
131 return task_queues_run_since_last_check_bitmap != 0; 121 return task_queues_run_since_last_check_bitmap != 0;
132 } 122 }
133 123
134 void IdleHelper::EnableLongIdlePeriod() { 124 void IdleHelper::EnableLongIdlePeriod() {
135 TRACE_EVENT0(disabled_by_default_tracing_category_, "EnableLongIdlePeriod"); 125 TRACE_EVENT0(disabled_by_default_tracing_category_, "EnableLongIdlePeriod");
136 helper_->CheckOnValidThread(); 126 helper_->CheckOnValidThread();
127 if (helper_->IsShutdown())
128 return;
137 129
138 // End any previous idle period. 130 // End any previous idle period.
139 EndIdlePeriod(); 131 EndIdlePeriod();
140 132
141 if (ShouldWaitForQuiescence()) { 133 if (ShouldWaitForQuiescence()) {
142 helper_->ControlTaskRunner()->PostDelayedTask( 134 helper_->ControlTaskRunner()->PostDelayedTask(
143 FROM_HERE, enable_next_long_idle_period_closure_.callback(), 135 FROM_HERE, enable_next_long_idle_period_closure_.callback(),
144 required_quiescence_duration_before_long_idle_period_); 136 required_quiescence_duration_before_long_idle_period_);
145 delegate_->IsNotQuiescent(); 137 delegate_->IsNotQuiescent();
146 return; 138 return;
147 } 139 }
148 140
149 base::TimeTicks now(helper_->Now()); 141 base::TimeTicks now(helper_->Now());
150 base::TimeDelta next_long_idle_period_delay; 142 base::TimeDelta next_long_idle_period_delay;
151 IdlePeriodState new_idle_period_state = 143 IdlePeriodState new_idle_period_state =
152 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); 144 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay);
153 if (IsInIdlePeriod(new_idle_period_state)) { 145 if (IsInIdlePeriod(new_idle_period_state)) {
154 StartIdlePeriod(new_idle_period_state, now, 146 StartIdlePeriod(new_idle_period_state, now,
155 now + next_long_idle_period_delay, false); 147 now + next_long_idle_period_delay);
156 }
157
158 if (helper_->IsQueueEmpty(idle_queue_index_)) {
159 // If there are no current idle tasks then post the call to initiate the
160 // next idle for execution after wakeup (at which point after-wakeup idle
161 // tasks might be eligible to run or more idle tasks posted).
162 helper_->ControlAfterWakeUpTaskRunner()->PostDelayedTask(
163 FROM_HERE,
164 enable_next_long_idle_period_after_wakeup_closure_.callback(),
165 next_long_idle_period_delay);
166 } else { 148 } else {
167 // Otherwise post on the normal control task queue. 149 // Otherwise wait for the next long idle period delay before trying again.
168 helper_->ControlTaskRunner()->PostDelayedTask( 150 helper_->ControlTaskRunner()->PostDelayedTask(
169 FROM_HERE, enable_next_long_idle_period_closure_.callback(), 151 FROM_HERE, enable_next_long_idle_period_closure_.callback(),
170 next_long_idle_period_delay); 152 next_long_idle_period_delay);
171 } 153 }
172 } 154 }
173 155
174 void IdleHelper::EnableLongIdlePeriodAfterWakeup() {
175 TRACE_EVENT0(disabled_by_default_tracing_category_,
176 "EnableLongIdlePeriodAfterWakeup");
177 helper_->CheckOnValidThread();
178
179 if (IsInIdlePeriod(idle_period_state_)) {
180 // Since we were asleep until now, end the async idle period trace event at
181 // the time when it would have ended were we awake.
182 TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0(
183 tracing_category_, idle_period_tracing_name_, this,
184 std::min(idle_period_deadline_, helper_->Now()).ToInternalValue());
185 idle_period_state_ = IdlePeriodState::ENDING_LONG_IDLE_PERIOD;
186 EndIdlePeriod();
187 }
188
189 // Post a task to initiate the next long idle period rather than calling it
190 // directly to allow all pending PostIdleTaskAfterWakeup tasks to get enqueued
191 // on the idle task queue before the next idle period starts so they are
192 // eligible to be run during the new idle period.
193 helper_->ControlTaskRunner()->PostTask(
194 FROM_HERE, enable_next_long_idle_period_closure_.callback());
195 }
196
197 void IdleHelper::StartIdlePeriod(IdlePeriodState new_state, 156 void IdleHelper::StartIdlePeriod(IdlePeriodState new_state,
198 base::TimeTicks now, 157 base::TimeTicks now,
199 base::TimeTicks idle_period_deadline, 158 base::TimeTicks idle_period_deadline) {
200 bool post_end_idle_period) {
201 DCHECK_GT(idle_period_deadline, now); 159 DCHECK_GT(idle_period_deadline, now);
202 TRACE_EVENT_ASYNC_BEGIN0(tracing_category_, idle_period_tracing_name_, this);
203 helper_->CheckOnValidThread(); 160 helper_->CheckOnValidThread();
204 DCHECK(IsInIdlePeriod(new_state)); 161 DCHECK(IsInIdlePeriod(new_state));
162 TRACE_EVENT0(disabled_by_default_tracing_category_, "StartIdlePeriod");
205 163
206 helper_->EnableQueue(idle_queue_index_, 164 helper_->EnableQueue(idle_queue_index_,
207 PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY); 165 PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY);
208 helper_->PumpQueue(idle_queue_index_); 166 helper_->PumpQueue(idle_queue_index_);
209 idle_period_state_ = new_state;
210 167
211 idle_period_deadline_ = idle_period_deadline; 168 state_.UpdateState(new_state, idle_period_deadline, now);
212 if (post_end_idle_period) {
213 helper_->ControlTaskRunner()->PostDelayedTask(
214 FROM_HERE, end_idle_period_closure_.callback(),
215 idle_period_deadline_ - now);
216 }
217 } 169 }
218 170
219 void IdleHelper::EndIdlePeriod() { 171 void IdleHelper::EndIdlePeriod() {
220 helper_->CheckOnValidThread(); 172 helper_->CheckOnValidThread();
173 TRACE_EVENT0(disabled_by_default_tracing_category_, "EndIdlePeriod");
221 174
222 end_idle_period_closure_.Cancel();
223 enable_next_long_idle_period_closure_.Cancel(); 175 enable_next_long_idle_period_closure_.Cancel();
224 enable_next_long_idle_period_after_wakeup_closure_.Cancel();
225 176
226 // If we weren't already within an idle period then early-out. 177 // If we weren't already within an idle period then early-out.
227 if (!IsInIdlePeriod(idle_period_state_)) 178 if (!IsInIdlePeriod(state_.idle_period_state()))
228 return; 179 return;
229 180
230 // If we are in the ENDING_LONG_IDLE_PERIOD state we have already logged the 181 helper_->DisableQueue(idle_queue_index_);
231 // trace event. 182 state_.UpdateState(IdlePeriodState::NOT_IN_IDLE_PERIOD, base::TimeTicks(),
232 if (idle_period_state_ != IdlePeriodState::ENDING_LONG_IDLE_PERIOD) { 183 base::TimeTicks());
233 bool is_tracing; 184 }
234 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); 185
235 if (is_tracing && !idle_period_deadline_.is_null() && 186 void IdleHelper::WillProcessTask(const base::PendingTask& pending_task) {
236 helper_->Now() > idle_period_deadline_) { 187 }
237 TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0( 188
238 tracing_category_, idle_period_tracing_name_, this, "DeadlineOverrun", 189 void IdleHelper::DidProcessTask(const base::PendingTask& pending_task) {
239 idle_period_deadline_.ToInternalValue()); 190 helper_->CheckOnValidThread();
191 TRACE_EVENT0(disabled_by_default_tracing_category_, "DidProcessTask");
192 if (IsInIdlePeriod(state_.idle_period_state()) &&
193 state_.idle_period_state() !=
194 IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED &&
195 helper_->Now() >= state_.idle_period_deadline()) {
196 // If the idle period deadline has now been reached, either end the idle
197 // period or trigger a new long-idle period.
198 if (IsInLongIdlePeriod(state_.idle_period_state())) {
199 EnableLongIdlePeriod();
200 } else {
201 DCHECK(IdlePeriodState::IN_SHORT_IDLE_PERIOD ==
202 state_.idle_period_state());
203 EndIdlePeriod();
240 } 204 }
241 TRACE_EVENT_ASYNC_END0(tracing_category_, idle_period_tracing_name_, this);
242 } 205 }
206 }
243 207
244 helper_->DisableQueue(idle_queue_index_); 208 void IdleHelper::UpdateLongIdlePeriodStateAfterIdleTask() {
245 idle_period_state_ = IdlePeriodState::NOT_IN_IDLE_PERIOD; 209 helper_->CheckOnValidThread();
246 idle_period_deadline_ = base::TimeTicks(); 210 DCHECK(IsInLongIdlePeriod(state_.idle_period_state()));
211 TRACE_EVENT0(disabled_by_default_tracing_category_,
212 "UpdateLongIdlePeriodStateAfterIdleTask");
213
214 TaskQueueManager::QueueState queue_state =
215 helper_->GetQueueState(idle_queue_index_);
216 if (queue_state == TaskQueueManager::QueueState::EMPTY) {
217 // If there are no more idle tasks then pause long idle period ticks until a
218 // new idle task is posted.
219 state_.UpdateState(IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED,
220 state_.idle_period_deadline(), base::TimeTicks());
221 } else if (queue_state == TaskQueueManager::QueueState::NEEDS_PUMPING) {
222 // If there is still idle work to do then just start the next idle period.
223 base::TimeDelta next_long_idle_period_delay;
224 if (state_.idle_period_state() ==
225 IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE) {
226 // If we are in a max deadline long idle period then start the next
227 // idle period immediately.
228 next_long_idle_period_delay = base::TimeDelta();
229 } else {
230 // Otherwise ensure that we kick the scheduler at the right time to
231 // initiate the next idle period.
232 next_long_idle_period_delay = std::max(
233 base::TimeDelta(), state_.idle_period_deadline() - helper_->Now());
234 }
235 helper_->ControlTaskRunner()->PostDelayedTask(
236 FROM_HERE, enable_next_long_idle_period_closure_.callback(),
237 next_long_idle_period_delay);
238 }
239 }
240
241 base::TimeTicks IdleHelper::CurrentIdleTaskDeadline() const {
242 helper_->CheckOnValidThread();
243 return state_.idle_period_deadline();
244 }
245
246 void IdleHelper::OnIdleTaskPosted() {
247 if (state_.idle_period_paused_flag()) {
248 // Restart long idle period ticks.
249 helper_->ControlTaskRunner()->PostTask(
250 FROM_HERE, enable_next_long_idle_period_closure_.callback());
251 }
252 }
253
254 base::TimeTicks IdleHelper::WillProcessIdleTask() const {
255 helper_->CheckOnValidThread();
256 DCHECK(IsInIdlePeriod(state_.idle_period_state()));
257
258 state_.WillProcessIdleTask();
259 return CurrentIdleTaskDeadline();
260 }
261
262 void IdleHelper::DidProcessIdleTask() {
263 helper_->CheckOnValidThread();
264 DCHECK(IsInIdlePeriod(state_.idle_period_state()));
265
266 state_.DidProcessIdleTask();
267 if (IsInLongIdlePeriod(state_.idle_period_state())) {
268 UpdateLongIdlePeriodStateAfterIdleTask();
269 }
247 } 270 }
248 271
249 // static 272 // static
250 bool IdleHelper::IsInIdlePeriod(IdlePeriodState state) { 273 bool IdleHelper::IsInIdlePeriod(IdlePeriodState state) {
251 return state != IdlePeriodState::NOT_IN_IDLE_PERIOD; 274 return state != IdlePeriodState::NOT_IN_IDLE_PERIOD;
252 } 275 }
253 276
277 // static
278 bool IdleHelper::IsInLongIdlePeriod(IdlePeriodState state) {
279 return state == IdlePeriodState::IN_LONG_IDLE_PERIOD ||
280 state == IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE ||
281 state == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED;
282 }
283
254 bool IdleHelper::CanExceedIdleDeadlineIfRequired() const { 284 bool IdleHelper::CanExceedIdleDeadlineIfRequired() const {
255 TRACE_EVENT0(tracing_category_, "CanExceedIdleDeadlineIfRequired"); 285 TRACE_EVENT0(disabled_by_default_tracing_category_,
286 "CanExceedIdleDeadlineIfRequired");
256 helper_->CheckOnValidThread(); 287 helper_->CheckOnValidThread();
257 return idle_period_state_ == 288 return state_.idle_period_state() ==
258 IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE; 289 IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE;
259 } 290 }
260 291
261 IdleHelper::IdlePeriodState IdleHelper::SchedulerIdlePeriodState() const { 292 IdleHelper::IdlePeriodState IdleHelper::SchedulerIdlePeriodState() const {
262 return idle_period_state_; 293 return state_.idle_period_state();
294 }
295
296 IdleHelper::State::State(SchedulerHelper* helper,
297 const char* tracing_category,
298 const char* disabled_by_default_tracing_category,
299 const char* idle_period_tracing_name)
300 : helper_(helper),
301 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD),
302 idle_period_paused_flag_(&write_lock_),
303 nestable_events_started_(false),
304 tracing_category_(tracing_category),
305 disabled_by_default_tracing_category_(
306 disabled_by_default_tracing_category),
307 idle_period_tracing_name_(idle_period_tracing_name) {
308 }
309
310 IdleHelper::State::~State() {
311 }
312
313 void IdleHelper::State::UpdateState(IdlePeriodState new_state,
314 base::TimeTicks new_deadline,
315 base::TimeTicks optional_now) {
316 helper_->CheckOnValidThread();
317 if (new_state == idle_period_state_) {
318 DCHECK(new_deadline == idle_period_deadline_);
319 return;
320 }
321
322 base::AutoLock lock(write_lock_);
323
324 bool is_tracing;
325 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing);
326 if (is_tracing) {
327 base::TimeTicks now(optional_now.is_null() ? helper_->Now() : optional_now);
328 TraceEventIdlePeriodStateChange(new_state, new_deadline, now);
329 idle_period_deadline_for_tracing_ =
330 base::TimeTicks::NowFromSystemTraceTime() + (new_deadline - now);
331 }
332
333 idle_period_state_ = new_state;
334 idle_period_deadline_ = new_deadline;
335 idle_period_paused_flag_.SetWhileLocked(
336 new_state == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED);
337 }
338
339 void IdleHelper::State::WillProcessIdleTask() const {
Sami 2015/05/29 09:38:06 Should we call these something like TraceIdleTaskS
rmcilroy 2015/06/01 15:33:22 SGTM, done.
340 helper_->CheckOnValidThread();
341
342 bool is_tracing;
343 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing);
344 if (is_tracing && nestable_events_started_) {
345 last_traced_start_running_idle_task_ =
346 base::TimeTicks::NowFromSystemTraceTime();
347 TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
348 tracing_category_, "RunningIdleTask", this,
349 last_traced_start_running_idle_task_.ToInternalValue());
350 }
351 }
352
353 void IdleHelper::State::DidProcessIdleTask() const {
354 helper_->CheckOnValidThread();
355
356 bool is_tracing;
357 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing);
358 if (is_tracing && nestable_events_started_) {
359 if (!idle_period_deadline_for_tracing_.is_null() &&
360 base::TimeTicks::NowFromSystemTraceTime() >
361 idle_period_deadline_for_tracing_) {
362 TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
363 tracing_category_, "DeadlineOverrun", this,
364 std::max(idle_period_deadline_for_tracing_,
365 last_traced_start_running_idle_task_).ToInternalValue());
366 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "DeadlineOverrun",
367 this);
368 }
369 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "RunningIdleTask", this);
370 }
371 }
372
373 void IdleHelper::State::TraceEventIdlePeriodStateChange(
374 IdlePeriodState new_state,
375 base::TimeTicks new_deadline,
376 base::TimeTicks now) const {
377 TRACE_EVENT2(disabled_by_default_tracing_category_, "SetIdlePeriodState",
378 "old_state",
379 IdleHelper::IdlePeriodStateToString(idle_period_state_),
380 "new_state", IdleHelper::IdlePeriodStateToString(new_state));
381 if (nestable_events_started_) {
382 // End async tracing events for the state we are leaving.
383 if (idle_period_state_ == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) {
384 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "LongIdlePeriodPaused",
385 this);
386 }
387 if (IsInLongIdlePeriod(idle_period_state_) &&
388 !IsInLongIdlePeriod(new_state)) {
389 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "LongIdlePeriod",
390 this);
391 }
392 if (idle_period_state_ == IdlePeriodState::IN_SHORT_IDLE_PERIOD) {
393 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "ShortIdlePeriod",
394 this);
395 }
396 if (IsInIdlePeriod(idle_period_state_) && !IsInIdlePeriod(new_state)) {
397 TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_,
398 idle_period_tracing_name_, this);
399 nestable_events_started_ = false;
400 }
401 }
402
403 // Start async tracing events for the state we are entering.
404 if (IsInIdlePeriod(new_state) && !IsInIdlePeriod(idle_period_state_)) {
405 nestable_events_started_ = true;
406 TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
407 tracing_category_, idle_period_tracing_name_, this,
408 "idle_period_length_ms", (new_deadline - now).ToInternalValue());
409 }
410 if (new_state == IdlePeriodState::IN_SHORT_IDLE_PERIOD) {
411 TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "ShortIdlePeriod",
412 this);
413 }
414 if (IsInLongIdlePeriod(new_state) &&
415 !IsInLongIdlePeriod(idle_period_state_)) {
416 TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "LongIdlePeriod",
417 this);
418 }
419 if (new_state == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) {
420 TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "LongIdlePeriodPaused",
421 this);
422 }
263 } 423 }
264 424
265 // static 425 // static
266 const char* IdleHelper::IdlePeriodStateToString( 426 const char* IdleHelper::IdlePeriodStateToString(
267 IdlePeriodState idle_period_state) { 427 IdlePeriodState idle_period_state) {
268 switch (idle_period_state) { 428 switch (idle_period_state) {
269 case IdlePeriodState::NOT_IN_IDLE_PERIOD: 429 case IdlePeriodState::NOT_IN_IDLE_PERIOD:
270 return "not_in_idle_period"; 430 return "not_in_idle_period";
271 case IdlePeriodState::IN_SHORT_IDLE_PERIOD: 431 case IdlePeriodState::IN_SHORT_IDLE_PERIOD:
272 return "in_short_idle_period"; 432 return "in_short_idle_period";
273 case IdlePeriodState::IN_LONG_IDLE_PERIOD: 433 case IdlePeriodState::IN_LONG_IDLE_PERIOD:
274 return "in_long_idle_period"; 434 return "in_long_idle_period";
275 case IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE: 435 case IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE:
276 return "in_long_idle_period_with_max_deadline"; 436 return "in_long_idle_period_with_max_deadline";
277 case IdlePeriodState::ENDING_LONG_IDLE_PERIOD: 437 case IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED:
278 return "ending_long_idle_period"; 438 return "in_long_idle_period_paused";
279 default: 439 default:
280 NOTREACHED(); 440 NOTREACHED();
281 return nullptr; 441 return nullptr;
282 } 442 }
283 } 443 }
284 444
285 } // namespace scheduler 445 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698