Chromium Code Reviews| Index: components/scheduler/child/scheduler_helper.cc |
| diff --git a/components/scheduler/child/scheduler_helper.cc b/components/scheduler/child/scheduler_helper.cc |
| index 19e8d2b65120525765527af4775d9564d2590f51..15405f3dfb4ce77d3e766d996bf70e22fa805690 100644 |
| --- a/components/scheduler/child/scheduler_helper.cc |
| +++ b/components/scheduler/child/scheduler_helper.cc |
| @@ -4,6 +4,7 @@ |
| #include "components/scheduler/child/scheduler_helper.h" |
| +#include "base/synchronization/waitable_event.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_argument.h" |
| #include "components/scheduler/child/nestable_single_thread_task_runner.h" |
| @@ -34,6 +35,9 @@ SchedulerHelper::SchedulerHelper( |
| QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), |
| default_task_runner_( |
| task_queue_manager_->TaskRunnerForQueue(QueueId::DEFAULT_TASK_QUEUE)), |
| + shutdown_task_runner_(task_queue_manager_->TaskRunnerForQueue( |
| + QueueId::SHUTDOWN_TASK_QUEUE)), |
| + total_task_queue_count_(total_task_queue_count), |
| quiescence_monitored_task_queue_mask_( |
| ((1ull << total_task_queue_count) - 1ull) & |
| ~(1ull << QueueId::IDLE_TASK_QUEUE) & |
| @@ -97,6 +101,20 @@ SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { |
| SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { |
| } |
| +void SchedulerHelper::PreShutdown() { |
| + CheckOnValidThread(); |
| + TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdownInternal"); |
| + EndIdlePeriod(); |
| + task_queue_selector_->DisableQueue(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE); |
| + 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
|
| + task_queue_selector_->DisableQueue(QueueId::DEFAULT_TASK_QUEUE); |
| + task_queue_manager_->FlushQueue(QueueId::DEFAULT_TASK_QUEUE); |
| + for (size_t i = TASK_QUEUE_COUNT; i < total_task_queue_count_; i++) { |
| + task_queue_selector_->DisableQueue(i); |
| + task_queue_manager_->FlushQueue(i); |
| + } |
| +} |
| + |
| void SchedulerHelper::Shutdown() { |
| CheckOnValidThread(); |
| task_queue_manager_.reset(); |
| @@ -114,6 +132,11 @@ scoped_refptr<SingleThreadIdleTaskRunner> SchedulerHelper::IdleTaskRunner() { |
| } |
| scoped_refptr<base::SingleThreadTaskRunner> |
| +SchedulerHelper::ShutdownTaskRunner() { |
| + return shutdown_task_runner_; |
| +} |
| + |
| +scoped_refptr<base::SingleThreadTaskRunner> |
| SchedulerHelper::ControlTaskRunner() { |
| return control_task_runner_; |
| } |
| @@ -364,6 +387,8 @@ const char* SchedulerHelper::TaskQueueIdToString(QueueId queue_id) { |
| return "default_tq"; |
| case IDLE_TASK_QUEUE: |
| return "idle_tq"; |
| + case SHUTDOWN_TASK_QUEUE: |
| + return "shutdown_tq"; |
| case CONTROL_TASK_QUEUE: |
| return "control_tq"; |
| case CONTROL_TASK_AFTER_WAKEUP_QUEUE: |