OLD | NEW |
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/time/time.h" | 7 #include "base/time/time.h" |
8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
9 #include "base/trace_event/trace_event_argument.h" | 9 #include "base/trace_event/trace_event_argument.h" |
10 #include "components/scheduler/base/task_queue.h" | 10 #include "components/scheduler/base/task_queue.h" |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 DCHECK_EQ(new_deadline, idle_period_deadline_); | 355 DCHECK_EQ(new_deadline, idle_period_deadline_); |
356 return; | 356 return; |
357 } | 357 } |
358 | 358 |
359 bool is_tracing; | 359 bool is_tracing; |
360 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); | 360 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
361 if (is_tracing) { | 361 if (is_tracing) { |
362 base::TimeTicks now(optional_now.is_null() | 362 base::TimeTicks now(optional_now.is_null() |
363 ? helper_->tick_clock()->NowTicks() | 363 ? helper_->tick_clock()->NowTicks() |
364 : optional_now); | 364 : optional_now); |
365 base::TraceTicks trace_now = base::TraceTicks::Now(); | |
366 idle_period_deadline_for_tracing_ = trace_now + (new_deadline - now); | |
367 TraceEventIdlePeriodStateChange( | 365 TraceEventIdlePeriodStateChange( |
368 new_state, running_idle_task_for_tracing_, | 366 new_state, running_idle_task_for_tracing_, idle_period_deadline_, now); |
369 idle_period_deadline_for_tracing_, trace_now); | |
370 } | 367 } |
371 | 368 |
372 idle_period_state_ = new_state; | 369 idle_period_state_ = new_state; |
373 idle_period_deadline_ = new_deadline; | 370 idle_period_deadline_ = new_deadline; |
374 | 371 |
375 // Inform the delegate if we are starting or ending an idle period. | 372 // Inform the delegate if we are starting or ending an idle period. |
376 if (IsInIdlePeriod(new_state) && !IsInIdlePeriod(old_idle_period_state)) { | 373 if (IsInIdlePeriod(new_state) && !IsInIdlePeriod(old_idle_period_state)) { |
377 delegate_->OnIdlePeriodStarted(); | 374 delegate_->OnIdlePeriodStarted(); |
378 } else if (!IsInIdlePeriod(new_state) && | 375 } else if (!IsInIdlePeriod(new_state) && |
379 IsInIdlePeriod(old_idle_period_state)) { | 376 IsInIdlePeriod(old_idle_period_state)) { |
380 delegate_->OnIdlePeriodEnded(); | 377 delegate_->OnIdlePeriodEnded(); |
381 } | 378 } |
382 } | 379 } |
383 | 380 |
384 void IdleHelper::State::TraceIdleIdleTaskStart() { | 381 void IdleHelper::State::TraceIdleIdleTaskStart() { |
385 helper_->CheckOnValidThread(); | 382 helper_->CheckOnValidThread(); |
386 | 383 |
387 bool is_tracing; | 384 bool is_tracing; |
388 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); | 385 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
389 if (is_tracing) { | 386 if (is_tracing) { |
390 TraceEventIdlePeriodStateChange( | 387 TraceEventIdlePeriodStateChange( |
391 idle_period_state_, true, idle_period_deadline_for_tracing_, | 388 idle_period_state_, true, idle_period_deadline_, |
392 base::TraceTicks::Now()); | 389 base::TimeTicks::Now()); |
393 } | 390 } |
394 } | 391 } |
395 | 392 |
396 void IdleHelper::State::TraceIdleIdleTaskEnd() { | 393 void IdleHelper::State::TraceIdleIdleTaskEnd() { |
397 helper_->CheckOnValidThread(); | 394 helper_->CheckOnValidThread(); |
398 | 395 |
399 bool is_tracing; | 396 bool is_tracing; |
400 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); | 397 TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
401 if (is_tracing) { | 398 if (is_tracing) { |
402 TraceEventIdlePeriodStateChange( | 399 TraceEventIdlePeriodStateChange( |
403 idle_period_state_, false, idle_period_deadline_for_tracing_, | 400 idle_period_state_, false, idle_period_deadline_, |
404 base::TraceTicks::Now()); | 401 base::TimeTicks::Now()); |
405 } | 402 } |
406 } | 403 } |
407 | 404 |
408 void IdleHelper::State::TraceEventIdlePeriodStateChange( | 405 void IdleHelper::State::TraceEventIdlePeriodStateChange( |
409 IdlePeriodState new_state, | 406 IdlePeriodState new_state, |
410 bool new_running_idle_task, | 407 bool new_running_idle_task, |
411 base::TraceTicks new_deadline, | 408 base::TimeTicks new_deadline, |
412 base::TraceTicks now) { | 409 base::TimeTicks now) { |
413 TRACE_EVENT2(disabled_by_default_tracing_category_, "SetIdlePeriodState", | 410 TRACE_EVENT2(disabled_by_default_tracing_category_, "SetIdlePeriodState", |
414 "old_state", | 411 "old_state", |
415 IdleHelper::IdlePeriodStateToString(idle_period_state_), | 412 IdleHelper::IdlePeriodStateToString(idle_period_state_), |
416 "new_state", IdleHelper::IdlePeriodStateToString(new_state)); | 413 "new_state", IdleHelper::IdlePeriodStateToString(new_state)); |
417 | 414 |
418 if (idle_period_trace_event_started_ && running_idle_task_for_tracing_ && | 415 if (idle_period_trace_event_started_ && running_idle_task_for_tracing_ && |
419 !new_running_idle_task) { | 416 !new_running_idle_task) { |
420 running_idle_task_for_tracing_ = false; | 417 running_idle_task_for_tracing_ = false; |
421 if (!idle_period_deadline_for_tracing_.is_null() && | 418 if (!idle_period_deadline_.is_null() && now > idle_period_deadline_) { |
422 now > idle_period_deadline_for_tracing_) { | |
423 TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0( | 419 TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0( |
424 tracing_category_, idle_period_tracing_name_, this, | 420 tracing_category_, idle_period_tracing_name_, this, |
425 "DeadlineOverrun", | 421 "DeadlineOverrun", |
426 std::max(idle_period_deadline_for_tracing_, | 422 std::max(idle_period_deadline_, |
427 last_idle_task_trace_time_).ToInternalValue()); | 423 last_idle_task_trace_time_).ToInternalValue()); |
428 } | 424 } |
429 } | 425 } |
430 | 426 |
431 if (IsInIdlePeriod(new_state)) { | 427 if (IsInIdlePeriod(new_state)) { |
432 if (!idle_period_trace_event_started_) { | 428 if (!idle_period_trace_event_started_) { |
433 idle_period_trace_event_started_ = true; | 429 idle_period_trace_event_started_ = true; |
434 TRACE_EVENT_ASYNC_BEGIN1( | 430 TRACE_EVENT_ASYNC_BEGIN1( |
435 tracing_category_, idle_period_tracing_name_, this, | 431 tracing_category_, idle_period_tracing_name_, this, |
436 "idle_period_length_ms", (new_deadline - now).ToInternalValue()); | 432 "idle_period_length_ms", (new_deadline - now).ToInternalValue()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 return "in_long_idle_period_with_max_deadline"; | 472 return "in_long_idle_period_with_max_deadline"; |
477 case IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED: | 473 case IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED: |
478 return "in_long_idle_period_paused"; | 474 return "in_long_idle_period_paused"; |
479 default: | 475 default: |
480 NOTREACHED(); | 476 NOTREACHED(); |
481 return nullptr; | 477 return nullptr; |
482 } | 478 } |
483 } | 479 } |
484 | 480 |
485 } // namespace scheduler | 481 } // namespace scheduler |
OLD | NEW |