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..4e9910ae6b52af3b1259237ac8e266896da3cecf 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,19 @@ SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { |
SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { |
} |
+void SchedulerHelper::PreShutdown() { |
+ CheckOnValidThread(); |
+ TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdownInternal"); |
+ task_queue_selector_->DisableQueue(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE); |
+ task_queue_selector_->DisableQueue(QueueId::DEFAULT_TASK_QUEUE); |
+ task_queue_selector_->DisableQueue(QueueId::IDLE_TASK_QUEUE); |
+ for (size_t i = TASK_QUEUE_COUNT; i < total_task_queue_count_; i++) { |
+ task_queue_selector_->DisableQueue(i); |
+ } |
+ // Prevent any further enabling/disabling of queues. |
+ task_queue_selector_->PreShutdown(); |
+} |
+ |
void SchedulerHelper::Shutdown() { |
CheckOnValidThread(); |
task_queue_manager_.reset(); |
@@ -114,6 +131,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 +386,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: |