| 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 "platform/scheduler/child/idle_helper.h" | 5 #include "platform/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 "platform/scheduler/base/real_time_domain.h" | 10 #include "platform/scheduler/base/real_time_domain.h" |
| 11 #include "public/platform/scheduler/base/task_queue.h" | 11 #include "platform/scheduler/base/task_queue.h" |
| 12 #include "platform/scheduler/base/task_queue_manager.h" | 12 #include "platform/scheduler/base/task_queue_manager.h" |
| 13 #include "platform/scheduler/child/scheduler_helper.h" | 13 #include "platform/scheduler/child/scheduler_helper.h" |
| 14 #include "platform/scheduler/child/scheduler_tqm_delegate.h" | 14 #include "platform/scheduler/child/scheduler_tqm_delegate.h" |
| 15 | 15 |
| 16 namespace blink { | 16 namespace blink { |
| 17 namespace scheduler { | 17 namespace scheduler { |
| 18 | 18 |
| 19 IdleHelper::IdleHelper( | 19 IdleHelper::IdleHelper( |
| 20 SchedulerHelper* helper, | 20 SchedulerHelper* helper, |
| 21 Delegate* delegate, | 21 Delegate* delegate, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 void IdleHelper::EnableLongIdlePeriod() { | 134 void IdleHelper::EnableLongIdlePeriod() { |
| 135 TRACE_EVENT0(disabled_by_default_tracing_category_, "EnableLongIdlePeriod"); | 135 TRACE_EVENT0(disabled_by_default_tracing_category_, "EnableLongIdlePeriod"); |
| 136 helper_->CheckOnValidThread(); | 136 helper_->CheckOnValidThread(); |
| 137 if (is_shutdown_) | 137 if (is_shutdown_) |
| 138 return; | 138 return; |
| 139 | 139 |
| 140 // End any previous idle period. | 140 // End any previous idle period. |
| 141 EndIdlePeriod(); | 141 EndIdlePeriod(); |
| 142 | 142 |
| 143 if (ShouldWaitForQuiescence()) { | 143 if (ShouldWaitForQuiescence()) { |
| 144 helper_->ControlTaskRunner()->PostDelayedTask( | 144 helper_->ControlTaskQueue()->PostDelayedTask( |
| 145 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), | 145 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), |
| 146 required_quiescence_duration_before_long_idle_period_); | 146 required_quiescence_duration_before_long_idle_period_); |
| 147 delegate_->IsNotQuiescent(); | 147 delegate_->IsNotQuiescent(); |
| 148 return; | 148 return; |
| 149 } | 149 } |
| 150 | 150 |
| 151 base::TimeTicks now(helper_->scheduler_tqm_delegate()->NowTicks()); | 151 base::TimeTicks now(helper_->scheduler_tqm_delegate()->NowTicks()); |
| 152 base::TimeDelta next_long_idle_period_delay; | 152 base::TimeDelta next_long_idle_period_delay; |
| 153 IdlePeriodState new_idle_period_state = | 153 IdlePeriodState new_idle_period_state = |
| 154 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); | 154 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); |
| 155 if (IsInIdlePeriod(new_idle_period_state)) { | 155 if (IsInIdlePeriod(new_idle_period_state)) { |
| 156 StartIdlePeriod(new_idle_period_state, now, | 156 StartIdlePeriod(new_idle_period_state, now, |
| 157 now + next_long_idle_period_delay); | 157 now + next_long_idle_period_delay); |
| 158 } else { | 158 } else { |
| 159 // Otherwise wait for the next long idle period delay before trying again. | 159 // Otherwise wait for the next long idle period delay before trying again. |
| 160 helper_->ControlTaskRunner()->PostDelayedTask( | 160 helper_->ControlTaskQueue()->PostDelayedTask( |
| 161 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), | 161 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), |
| 162 next_long_idle_period_delay); | 162 next_long_idle_period_delay); |
| 163 } | 163 } |
| 164 } | 164 } |
| 165 | 165 |
| 166 void IdleHelper::StartIdlePeriod(IdlePeriodState new_state, | 166 void IdleHelper::StartIdlePeriod(IdlePeriodState new_state, |
| 167 base::TimeTicks now, | 167 base::TimeTicks now, |
| 168 base::TimeTicks idle_period_deadline) { | 168 base::TimeTicks idle_period_deadline) { |
| 169 DCHECK(!is_shutdown_); | 169 DCHECK(!is_shutdown_); |
| 170 DCHECK_GT(idle_period_deadline, now); | 170 DCHECK_GT(idle_period_deadline, now); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 } else { | 265 } else { |
| 266 // Otherwise ensure that we kick the scheduler at the right time to | 266 // Otherwise ensure that we kick the scheduler at the right time to |
| 267 // initiate the next idle period. | 267 // initiate the next idle period. |
| 268 next_long_idle_period_delay = std::max( | 268 next_long_idle_period_delay = std::max( |
| 269 base::TimeDelta(), state_.idle_period_deadline() - | 269 base::TimeDelta(), state_.idle_period_deadline() - |
| 270 helper_->scheduler_tqm_delegate()->NowTicks()); | 270 helper_->scheduler_tqm_delegate()->NowTicks()); |
| 271 } | 271 } |
| 272 if (next_long_idle_period_delay.is_zero()) { | 272 if (next_long_idle_period_delay.is_zero()) { |
| 273 EnableLongIdlePeriod(); | 273 EnableLongIdlePeriod(); |
| 274 } else { | 274 } else { |
| 275 helper_->ControlTaskRunner()->PostDelayedTask( | 275 helper_->ControlTaskQueue()->PostDelayedTask( |
| 276 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), | 276 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback(), |
| 277 next_long_idle_period_delay); | 277 next_long_idle_period_delay); |
| 278 } | 278 } |
| 279 } | 279 } |
| 280 } | 280 } |
| 281 | 281 |
| 282 base::TimeTicks IdleHelper::CurrentIdleTaskDeadline() const { | 282 base::TimeTicks IdleHelper::CurrentIdleTaskDeadline() const { |
| 283 helper_->CheckOnValidThread(); | 283 helper_->CheckOnValidThread(); |
| 284 return state_.idle_period_deadline(); | 284 return state_.idle_period_deadline(); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void IdleHelper::OnIdleTaskPosted() { | 287 void IdleHelper::OnIdleTaskPosted() { |
| 288 TRACE_EVENT0(disabled_by_default_tracing_category_, "OnIdleTaskPosted"); | 288 TRACE_EVENT0(disabled_by_default_tracing_category_, "OnIdleTaskPosted"); |
| 289 if (is_shutdown_) | 289 if (is_shutdown_) |
| 290 return; | 290 return; |
| 291 if (idle_task_runner_->RunsTasksOnCurrentThread()) { | 291 if (idle_task_runner_->RunsTasksOnCurrentThread()) { |
| 292 OnIdleTaskPostedOnMainThread(); | 292 OnIdleTaskPostedOnMainThread(); |
| 293 } else { | 293 } else { |
| 294 helper_->ControlTaskRunner()->PostTask( | 294 helper_->ControlTaskQueue()->PostTask( |
| 295 FROM_HERE, on_idle_task_posted_closure_.GetCallback()); | 295 FROM_HERE, on_idle_task_posted_closure_.GetCallback()); |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 | 298 |
| 299 void IdleHelper::OnIdleTaskPostedOnMainThread() { | 299 void IdleHelper::OnIdleTaskPostedOnMainThread() { |
| 300 TRACE_EVENT0(disabled_by_default_tracing_category_, | 300 TRACE_EVENT0(disabled_by_default_tracing_category_, |
| 301 "OnIdleTaskPostedOnMainThread"); | 301 "OnIdleTaskPostedOnMainThread"); |
| 302 if (is_shutdown_) | 302 if (is_shutdown_) |
| 303 return; | 303 return; |
| 304 if (state_.idle_period_state() == | 304 if (state_.idle_period_state() == |
| 305 IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { | 305 IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED) { |
| 306 // Restart long idle period ticks. | 306 // Restart long idle period ticks. |
| 307 helper_->ControlTaskRunner()->PostTask( | 307 helper_->ControlTaskQueue()->PostTask( |
| 308 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback()); | 308 FROM_HERE, enable_next_long_idle_period_closure_.GetCallback()); |
| 309 } | 309 } |
| 310 } | 310 } |
| 311 | 311 |
| 312 base::TimeTicks IdleHelper::WillProcessIdleTask() { | 312 base::TimeTicks IdleHelper::WillProcessIdleTask() { |
| 313 helper_->CheckOnValidThread(); | 313 helper_->CheckOnValidThread(); |
| 314 DCHECK(!is_shutdown_); | 314 DCHECK(!is_shutdown_); |
| 315 state_.TraceIdleIdleTaskStart(); | 315 state_.TraceIdleIdleTaskStart(); |
| 316 return CurrentIdleTaskDeadline(); | 316 return CurrentIdleTaskDeadline(); |
| 317 } | 317 } |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 case IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED: | 503 case IdlePeriodState::IN_LONG_IDLE_PERIOD_PAUSED: |
| 504 return "in_long_idle_period_paused"; | 504 return "in_long_idle_period_paused"; |
| 505 default: | 505 default: |
| 506 NOTREACHED(); | 506 NOTREACHED(); |
| 507 return nullptr; | 507 return nullptr; |
| 508 } | 508 } |
| 509 } | 509 } |
| 510 | 510 |
| 511 } // namespace scheduler | 511 } // namespace scheduler |
| 512 } // namespace blink | 512 } // namespace blink |
| OLD | NEW |