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/scheduler_helper.h" | 5 #include "components/scheduler/child/scheduler_helper.h" |
6 | 6 |
7 #include "base/synchronization/waitable_event.h" | |
7 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
8 #include "base/trace_event/trace_event_argument.h" | 9 #include "base/trace_event/trace_event_argument.h" |
9 #include "components/scheduler/child/nestable_single_thread_task_runner.h" | 10 #include "components/scheduler/child/nestable_single_thread_task_runner.h" |
10 #include "components/scheduler/child/prioritizing_task_queue_selector.h" | 11 #include "components/scheduler/child/prioritizing_task_queue_selector.h" |
11 #include "components/scheduler/child/time_source.h" | 12 #include "components/scheduler/child/time_source.h" |
12 | 13 |
13 namespace scheduler { | 14 namespace scheduler { |
14 | 15 |
15 SchedulerHelper::SchedulerHelper( | 16 SchedulerHelper::SchedulerHelper( |
16 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, | 17 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, |
(...skipping 10 matching lines...) Expand all Loading... | |
27 task_queue_selector_.get(), | 28 task_queue_selector_.get(), |
28 disabled_by_default_tracing_category)), | 29 disabled_by_default_tracing_category)), |
29 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), | 30 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), |
30 scheduler_helper_delegate_(scheduler_helper_delegate), | 31 scheduler_helper_delegate_(scheduler_helper_delegate), |
31 control_task_runner_( | 32 control_task_runner_( |
32 task_queue_manager_->TaskRunnerForQueue(QueueId::CONTROL_TASK_QUEUE)), | 33 task_queue_manager_->TaskRunnerForQueue(QueueId::CONTROL_TASK_QUEUE)), |
33 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( | 34 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( |
34 QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), | 35 QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), |
35 default_task_runner_( | 36 default_task_runner_( |
36 task_queue_manager_->TaskRunnerForQueue(QueueId::DEFAULT_TASK_QUEUE)), | 37 task_queue_manager_->TaskRunnerForQueue(QueueId::DEFAULT_TASK_QUEUE)), |
38 shutdown_task_runner_(task_queue_manager_->TaskRunnerForQueue( | |
39 QueueId::SHUTDOWN_TASK_QUEUE)), | |
40 total_task_queue_count_(total_task_queue_count), | |
37 quiescence_monitored_task_queue_mask_( | 41 quiescence_monitored_task_queue_mask_( |
38 ((1ull << total_task_queue_count) - 1ull) & | 42 ((1ull << total_task_queue_count) - 1ull) & |
39 ~(1ull << QueueId::IDLE_TASK_QUEUE) & | 43 ~(1ull << QueueId::IDLE_TASK_QUEUE) & |
40 ~(1ull << QueueId::CONTROL_TASK_QUEUE) & | 44 ~(1ull << QueueId::CONTROL_TASK_QUEUE) & |
41 ~(1ull << QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), | 45 ~(1ull << QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), |
42 required_quiescence_duration_before_long_idle_period_( | 46 required_quiescence_duration_before_long_idle_period_( |
43 required_quiescence_duration_before_long_idle_period), | 47 required_quiescence_duration_before_long_idle_period), |
44 time_source_(new TimeSource), | 48 time_source_(new TimeSource), |
45 tracing_category_(tracing_category), | 49 tracing_category_(tracing_category), |
46 disabled_by_default_tracing_category_( | 50 disabled_by_default_tracing_category_( |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
90 | 94 |
91 SchedulerHelper::~SchedulerHelper() { | 95 SchedulerHelper::~SchedulerHelper() { |
92 } | 96 } |
93 | 97 |
94 SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { | 98 SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { |
95 } | 99 } |
96 | 100 |
97 SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { | 101 SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { |
98 } | 102 } |
99 | 103 |
104 void SchedulerHelper::PreShutdown() { | |
105 CheckOnValidThread(); | |
106 TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdownInternal"); | |
107 EndIdlePeriod(); | |
108 task_queue_selector_->DisableQueue(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE); | |
109 task_queue_manager_->FlushQueue(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE); | |
Sami
2015/04/23 18:47:49
Why do we need to flush again? Won't the selector
alex clarke (OOO till 29th)
2015/04/24 09:32:36
I was worried about crashes on shutdown. I was ab
| |
110 task_queue_selector_->DisableQueue(QueueId::DEFAULT_TASK_QUEUE); | |
111 task_queue_manager_->FlushQueue(QueueId::DEFAULT_TASK_QUEUE); | |
112 for (size_t i = TASK_QUEUE_COUNT; i < total_task_queue_count_; i++) { | |
113 task_queue_selector_->DisableQueue(i); | |
114 task_queue_manager_->FlushQueue(i); | |
115 } | |
116 } | |
117 | |
100 void SchedulerHelper::Shutdown() { | 118 void SchedulerHelper::Shutdown() { |
101 CheckOnValidThread(); | 119 CheckOnValidThread(); |
102 task_queue_manager_.reset(); | 120 task_queue_manager_.reset(); |
103 } | 121 } |
104 | 122 |
105 scoped_refptr<base::SingleThreadTaskRunner> | 123 scoped_refptr<base::SingleThreadTaskRunner> |
106 SchedulerHelper::DefaultTaskRunner() { | 124 SchedulerHelper::DefaultTaskRunner() { |
107 CheckOnValidThread(); | 125 CheckOnValidThread(); |
108 return default_task_runner_; | 126 return default_task_runner_; |
109 } | 127 } |
110 | 128 |
111 scoped_refptr<SingleThreadIdleTaskRunner> SchedulerHelper::IdleTaskRunner() { | 129 scoped_refptr<SingleThreadIdleTaskRunner> SchedulerHelper::IdleTaskRunner() { |
112 CheckOnValidThread(); | 130 CheckOnValidThread(); |
113 return idle_task_runner_; | 131 return idle_task_runner_; |
114 } | 132 } |
115 | 133 |
116 scoped_refptr<base::SingleThreadTaskRunner> | 134 scoped_refptr<base::SingleThreadTaskRunner> |
135 SchedulerHelper::ShutdownTaskRunner() { | |
136 return shutdown_task_runner_; | |
137 } | |
138 | |
139 scoped_refptr<base::SingleThreadTaskRunner> | |
117 SchedulerHelper::ControlTaskRunner() { | 140 SchedulerHelper::ControlTaskRunner() { |
118 return control_task_runner_; | 141 return control_task_runner_; |
119 } | 142 } |
120 | 143 |
121 void SchedulerHelper::CurrentIdleTaskDeadlineCallback( | 144 void SchedulerHelper::CurrentIdleTaskDeadlineCallback( |
122 base::TimeTicks* deadline_out) const { | 145 base::TimeTicks* deadline_out) const { |
123 CheckOnValidThread(); | 146 CheckOnValidThread(); |
124 *deadline_out = idle_period_deadline_; | 147 *deadline_out = idle_period_deadline_; |
125 } | 148 } |
126 | 149 |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 return task_queue_manager_->IsQueueEmpty(queue_index); | 380 return task_queue_manager_->IsQueueEmpty(queue_index); |
358 } | 381 } |
359 | 382 |
360 // static | 383 // static |
361 const char* SchedulerHelper::TaskQueueIdToString(QueueId queue_id) { | 384 const char* SchedulerHelper::TaskQueueIdToString(QueueId queue_id) { |
362 switch (queue_id) { | 385 switch (queue_id) { |
363 case DEFAULT_TASK_QUEUE: | 386 case DEFAULT_TASK_QUEUE: |
364 return "default_tq"; | 387 return "default_tq"; |
365 case IDLE_TASK_QUEUE: | 388 case IDLE_TASK_QUEUE: |
366 return "idle_tq"; | 389 return "idle_tq"; |
390 case SHUTDOWN_TASK_QUEUE: | |
391 return "shutdown_tq"; | |
367 case CONTROL_TASK_QUEUE: | 392 case CONTROL_TASK_QUEUE: |
368 return "control_tq"; | 393 return "control_tq"; |
369 case CONTROL_TASK_AFTER_WAKEUP_QUEUE: | 394 case CONTROL_TASK_AFTER_WAKEUP_QUEUE: |
370 return "control_after_wakeup_tq"; | 395 return "control_after_wakeup_tq"; |
371 default: | 396 default: |
372 NOTREACHED(); | 397 NOTREACHED(); |
373 return nullptr; | 398 return nullptr; |
374 } | 399 } |
375 } | 400 } |
376 | 401 |
(...skipping 25 matching lines...) Expand all Loading... | |
402 } | 427 } |
403 | 428 |
404 void SchedulerHelper::RemoveTaskObserver( | 429 void SchedulerHelper::RemoveTaskObserver( |
405 base::MessageLoop::TaskObserver* task_observer) { | 430 base::MessageLoop::TaskObserver* task_observer) { |
406 CheckOnValidThread(); | 431 CheckOnValidThread(); |
407 if (task_queue_manager_) | 432 if (task_queue_manager_) |
408 task_queue_manager_->RemoveTaskObserver(task_observer); | 433 task_queue_manager_->RemoveTaskObserver(task_observer); |
409 } | 434 } |
410 | 435 |
411 } // namespace scheduler | 436 } // namespace scheduler |
OLD | NEW |