Index: components/scheduler/child/idle_helper.cc |
diff --git a/components/scheduler/child/idle_helper.cc b/components/scheduler/child/idle_helper.cc |
index 07b66e66af7e541c31f9fa126077576a1050f27e..594196bb9c8e9760f8d8dc9f825de1339129fa02 100644 |
--- a/components/scheduler/child/idle_helper.cc |
+++ b/components/scheduler/child/idle_helper.cc |
@@ -279,8 +279,6 @@ void IdleHelper::OnIdleTaskPostedOnMainThread() { |
base::TimeTicks IdleHelper::WillProcessIdleTask() { |
helper_->CheckOnValidThread(); |
- DCHECK(IsInIdlePeriod(state_.idle_period_state())); |
- |
state_.TraceIdleIdleTaskStart(); |
return CurrentIdleTaskDeadline(); |
} |
@@ -325,7 +323,8 @@ IdleHelper::State::State(SchedulerHelper* helper, |
: helper_(helper), |
delegate_(delegate), |
idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), |
- nestable_events_started_(false), |
+ idle_period_trace_event_started_(false), |
+ running_idle_task_for_tracing_(false), |
tracing_category_(tracing_category), |
disabled_by_default_tracing_category_( |
disabled_by_default_tracing_category), |
@@ -360,9 +359,11 @@ void IdleHelper::State::UpdateState(IdlePeriodState new_state, |
TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
if (is_tracing) { |
base::TimeTicks now(optional_now.is_null() ? helper_->Now() : optional_now); |
- TraceEventIdlePeriodStateChange(new_state, new_deadline, now); |
- idle_period_deadline_for_tracing_ = |
- base::TraceTicks::Now() + (new_deadline - now); |
+ base::TraceTicks trace_now = base::TraceTicks::Now(); |
+ idle_period_deadline_for_tracing_ = trace_now + (new_deadline - now); |
+ TraceEventIdlePeriodStateChange( |
+ new_state, running_idle_task_for_tracing_, |
+ idle_period_deadline_for_tracing_, trace_now); |
} |
idle_period_state_ = new_state; |
@@ -382,11 +383,10 @@ void IdleHelper::State::TraceIdleIdleTaskStart() { |
bool is_tracing; |
TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
- if (is_tracing && nestable_events_started_) { |
- last_idle_task_trace_time_ = base::TraceTicks::Now(); |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( |
- tracing_category_, "RunningIdleTask", this, |
- last_idle_task_trace_time_.ToInternalValue()); |
+ if (is_tracing) { |
+ TraceEventIdlePeriodStateChange( |
+ idle_period_state_, true, idle_period_deadline_for_tracing_, |
+ base::TraceTicks::Now()); |
} |
} |
@@ -395,69 +395,67 @@ void IdleHelper::State::TraceIdleIdleTaskEnd() { |
bool is_tracing; |
TRACE_EVENT_CATEGORY_GROUP_ENABLED(tracing_category_, &is_tracing); |
- if (is_tracing && nestable_events_started_) { |
- if (!idle_period_deadline_for_tracing_.is_null() && |
- base::TraceTicks::Now() > idle_period_deadline_for_tracing_) { |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( |
- tracing_category_, "DeadlineOverrun", this, |
- std::max(idle_period_deadline_for_tracing_, |
- last_idle_task_trace_time_).ToInternalValue()); |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "DeadlineOverrun", |
- this); |
- } |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "RunningIdleTask", this); |
+ if (is_tracing) { |
+ TraceEventIdlePeriodStateChange( |
+ idle_period_state_, false, idle_period_deadline_for_tracing_, |
+ base::TraceTicks::Now()); |
} |
} |
void IdleHelper::State::TraceEventIdlePeriodStateChange( |
IdlePeriodState new_state, |
- base::TimeTicks new_deadline, |
- base::TimeTicks now) { |
+ bool new_running_idle_task, |
+ base::TraceTicks new_deadline, |
+ base::TraceTicks now) { |
TRACE_EVENT2(disabled_by_default_tracing_category_, "SetIdlePeriodState", |
"old_state", |
IdleHelper::IdlePeriodStateToString(idle_period_state_), |
"new_state", IdleHelper::IdlePeriodStateToString(new_state)); |
- if (nestable_events_started_) { |
- // End async tracing events for the state we are leaving. |
- if (idle_period_state_ == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "LongIdlePeriodPaused", |
- this); |
- } |
- if (IsInLongIdlePeriod(idle_period_state_) && |
- !IsInLongIdlePeriod(new_state)) { |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "LongIdlePeriod", |
- this); |
- } |
- if (idle_period_state_ == IdlePeriodState::IN_SHORT_IDLE_PERIOD) { |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, "ShortIdlePeriod", |
- this); |
- } |
- if (IsInIdlePeriod(idle_period_state_) && !IsInIdlePeriod(new_state)) { |
- TRACE_EVENT_NESTABLE_ASYNC_END0(tracing_category_, |
- idle_period_tracing_name_, this); |
- nestable_events_started_ = false; |
+ |
+ if (idle_period_trace_event_started_ && running_idle_task_for_tracing_ && |
+ !new_running_idle_task) { |
+ running_idle_task_for_tracing_ = false; |
+ if (!idle_period_deadline_for_tracing_.is_null() && |
+ now > idle_period_deadline_for_tracing_) { |
+ TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "DeadlineOverrun", |
+ std::max(idle_period_deadline_for_tracing_, |
+ last_idle_task_trace_time_).ToInternalValue()); |
} |
} |
- // Start async tracing events for the state we are entering. |
- if (IsInIdlePeriod(new_state) && !IsInIdlePeriod(idle_period_state_)) { |
- nestable_events_started_ = true; |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN1( |
- tracing_category_, idle_period_tracing_name_, this, |
- "idle_period_length_ms", (new_deadline - now).ToInternalValue()); |
- } |
- if (new_state == IdlePeriodState::IN_SHORT_IDLE_PERIOD) { |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "ShortIdlePeriod", |
- this); |
- } |
- if (IsInLongIdlePeriod(new_state) && |
- !IsInLongIdlePeriod(idle_period_state_)) { |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "LongIdlePeriod", |
- this); |
- } |
- if (new_state == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { |
- TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(tracing_category_, "LongIdlePeriodPaused", |
- this); |
+ if (IsInIdlePeriod(new_state)) { |
+ if (!idle_period_trace_event_started_) { |
+ idle_period_trace_event_started_ = true; |
+ TRACE_EVENT_ASYNC_BEGIN1( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "idle_period_length_ms", (new_deadline - now).ToInternalValue()); |
+ } |
+ |
+ if (new_running_idle_task) { |
+ last_idle_task_trace_time_ = now; |
+ running_idle_task_for_tracing_ = true; |
+ TRACE_EVENT_ASYNC_STEP_INTO0( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "RunningIdleTask"); |
+ } else if (new_state == IdlePeriodState::IN_SHORT_IDLE_PERIOD) { |
+ TRACE_EVENT_ASYNC_STEP_INTO0( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "ShortIdlePeriod"); |
+ } else if (IsInLongIdlePeriod(new_state) && |
+ new_state != IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { |
+ TRACE_EVENT_ASYNC_STEP_INTO0( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "LongIdlePeriod"); |
+ } else if (new_state == IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { |
+ TRACE_EVENT_ASYNC_STEP_INTO0( |
+ tracing_category_, idle_period_tracing_name_, this, |
+ "LongIdlePeriodPaused"); |
+ } |
+ } else if (idle_period_trace_event_started_) { |
+ idle_period_trace_event_started_ = false; |
+ TRACE_EVENT_ASYNC_END0(tracing_category_, idle_period_tracing_name_, this); |
} |
} |