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