| 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 "content/child/scheduler/scheduler_helper.h" | 5 #include "components/scheduler/child/scheduler_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 "content/child/scheduler/nestable_single_thread_task_runner.h" | 9 #include "components/scheduler/child/nestable_single_thread_task_runner.h" |
| 10 #include "content/child/scheduler/prioritizing_task_queue_selector.h" | 10 #include "components/scheduler/child/prioritizing_task_queue_selector.h" |
| 11 #include "content/child/scheduler/time_source.h" | 11 #include "components/scheduler/child/time_source.h" |
| 12 | 12 |
| 13 namespace content { | 13 namespace scheduler { |
| 14 | 14 |
| 15 SchedulerHelper::SchedulerHelper( | 15 SchedulerHelper::SchedulerHelper( |
| 16 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, | 16 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, |
| 17 SchedulerHelperDelegate* scheduler_helper_delegate, | 17 SchedulerHelperDelegate* scheduler_helper_delegate, |
| 18 const char* tracing_category, | 18 const char* tracing_category, |
| 19 const char* disabled_by_default_tracing_category, | 19 const char* disabled_by_default_tracing_category, |
| 20 const char* idle_period_tracing_name, | 20 const char* idle_period_tracing_name, |
| 21 size_t total_task_queue_count, | 21 size_t total_task_queue_count, |
| 22 base::TimeDelta required_quiescence_duration_before_long_idle_period) | 22 base::TimeDelta required_quiescence_duration_before_long_idle_period) |
| 23 : task_queue_selector_(new PrioritizingTaskQueueSelector()), | 23 : task_queue_selector_(new PrioritizingTaskQueueSelector()), |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 scheduler_helper_delegate_->IsNotQuiescent(); | 197 scheduler_helper_delegate_->IsNotQuiescent(); |
| 198 return; | 198 return; |
| 199 } | 199 } |
| 200 | 200 |
| 201 base::TimeTicks now(Now()); | 201 base::TimeTicks now(Now()); |
| 202 base::TimeDelta next_long_idle_period_delay; | 202 base::TimeDelta next_long_idle_period_delay; |
| 203 IdlePeriodState new_idle_period_state = | 203 IdlePeriodState new_idle_period_state = |
| 204 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); | 204 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); |
| 205 if (IsInIdlePeriod(new_idle_period_state)) { | 205 if (IsInIdlePeriod(new_idle_period_state)) { |
| 206 StartIdlePeriod(new_idle_period_state, now, | 206 StartIdlePeriod(new_idle_period_state, now, |
| 207 now + next_long_idle_period_delay, | 207 now + next_long_idle_period_delay, false); |
| 208 false); | |
| 209 } | 208 } |
| 210 | 209 |
| 211 if (task_queue_manager_->IsQueueEmpty(QueueId::IDLE_TASK_QUEUE)) { | 210 if (task_queue_manager_->IsQueueEmpty(QueueId::IDLE_TASK_QUEUE)) { |
| 212 // If there are no current idle tasks then post the call to initiate the | 211 // If there are no current idle tasks then post the call to initiate the |
| 213 // next idle for execution after wakeup (at which point after-wakeup idle | 212 // next idle for execution after wakeup (at which point after-wakeup idle |
| 214 // tasks might be eligible to run or more idle tasks posted). | 213 // tasks might be eligible to run or more idle tasks posted). |
| 215 control_task_after_wakeup_runner_->PostDelayedTask( | 214 control_task_after_wakeup_runner_->PostDelayedTask( |
| 216 FROM_HERE, | 215 FROM_HERE, |
| 217 enable_next_long_idle_period_after_wakeup_closure_.callback(), | 216 enable_next_long_idle_period_after_wakeup_closure_.callback(), |
| 218 next_long_idle_period_delay); | 217 next_long_idle_period_delay); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 DCHECK(IsInIdlePeriod(new_state)); | 256 DCHECK(IsInIdlePeriod(new_state)); |
| 258 | 257 |
| 259 task_queue_selector_->EnableQueue( | 258 task_queue_selector_->EnableQueue( |
| 260 QueueId::IDLE_TASK_QUEUE, | 259 QueueId::IDLE_TASK_QUEUE, |
| 261 PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY); | 260 PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY); |
| 262 task_queue_manager_->PumpQueue(QueueId::IDLE_TASK_QUEUE); | 261 task_queue_manager_->PumpQueue(QueueId::IDLE_TASK_QUEUE); |
| 263 idle_period_state_ = new_state; | 262 idle_period_state_ = new_state; |
| 264 | 263 |
| 265 idle_period_deadline_ = idle_period_deadline; | 264 idle_period_deadline_ = idle_period_deadline; |
| 266 if (post_end_idle_period) { | 265 if (post_end_idle_period) { |
| 267 control_task_runner_->PostDelayedTask( | 266 control_task_runner_->PostDelayedTask(FROM_HERE, |
| 268 FROM_HERE, | 267 end_idle_period_closure_.callback(), |
| 269 end_idle_period_closure_.callback(), | 268 idle_period_deadline_ - now); |
| 270 idle_period_deadline_ - now); | |
| 271 } | 269 } |
| 272 } | 270 } |
| 273 | 271 |
| 274 void SchedulerHelper::EndIdlePeriod() { | 272 void SchedulerHelper::EndIdlePeriod() { |
| 275 CheckOnValidThread(); | 273 CheckOnValidThread(); |
| 276 | 274 |
| 277 end_idle_period_closure_.Cancel(); | 275 end_idle_period_closure_.Cancel(); |
| 278 enable_next_long_idle_period_closure_.Cancel(); | 276 enable_next_long_idle_period_closure_.Cancel(); |
| 279 enable_next_long_idle_period_after_wakeup_closure_.Cancel(); | 277 enable_next_long_idle_period_after_wakeup_closure_.Cancel(); |
| 280 | 278 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 | 324 |
| 327 TaskQueueManager* SchedulerHelper::GetTaskQueueManagerForTesting() { | 325 TaskQueueManager* SchedulerHelper::GetTaskQueueManagerForTesting() { |
| 328 CheckOnValidThread(); | 326 CheckOnValidThread(); |
| 329 return task_queue_manager_.get(); | 327 return task_queue_manager_.get(); |
| 330 } | 328 } |
| 331 | 329 |
| 332 base::TimeTicks SchedulerHelper::Now() const { | 330 base::TimeTicks SchedulerHelper::Now() const { |
| 333 return time_source_->Now(); | 331 return time_source_->Now(); |
| 334 } | 332 } |
| 335 | 333 |
| 336 SchedulerHelper::IdlePeriodState | 334 SchedulerHelper::IdlePeriodState SchedulerHelper::SchedulerIdlePeriodState() |
| 337 SchedulerHelper::SchedulerIdlePeriodState() const { | 335 const { |
| 338 return idle_period_state_; | 336 return idle_period_state_; |
| 339 } | 337 } |
| 340 | 338 |
| 341 PrioritizingTaskQueueSelector* | 339 PrioritizingTaskQueueSelector* SchedulerHelper::SchedulerTaskQueueSelector() |
| 342 SchedulerHelper::SchedulerTaskQueueSelector() const { | 340 const { |
| 343 return task_queue_selector_.get(); | 341 return task_queue_selector_.get(); |
| 344 } | 342 } |
| 345 | 343 |
| 346 scoped_refptr<base::SingleThreadTaskRunner> SchedulerHelper::TaskRunnerForQueue( | 344 scoped_refptr<base::SingleThreadTaskRunner> SchedulerHelper::TaskRunnerForQueue( |
| 347 size_t queue_index) const { | 345 size_t queue_index) const { |
| 348 CheckOnValidThread(); | 346 CheckOnValidThread(); |
| 349 return task_queue_manager_->TaskRunnerForQueue(queue_index); | 347 return task_queue_manager_->TaskRunnerForQueue(queue_index); |
| 350 } | 348 } |
| 351 | 349 |
| 352 void SchedulerHelper::SetQueueName(size_t queue_index, const char* name) { | 350 void SchedulerHelper::SetQueueName(size_t queue_index, const char* name) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 task_queue_manager_->AddTaskObserver(task_observer); | 401 task_queue_manager_->AddTaskObserver(task_observer); |
| 404 } | 402 } |
| 405 | 403 |
| 406 void SchedulerHelper::RemoveTaskObserver( | 404 void SchedulerHelper::RemoveTaskObserver( |
| 407 base::MessageLoop::TaskObserver* task_observer) { | 405 base::MessageLoop::TaskObserver* task_observer) { |
| 408 CheckOnValidThread(); | 406 CheckOnValidThread(); |
| 409 if (task_queue_manager_) | 407 if (task_queue_manager_) |
| 410 task_queue_manager_->RemoveTaskObserver(task_observer); | 408 task_queue_manager_->RemoveTaskObserver(task_observer); |
| 411 } | 409 } |
| 412 | 410 |
| 413 } // namespace content | 411 } // namespace scheduler |
| OLD | NEW |