Index: components/scheduler/child/scheduler_helper.cc |
diff --git a/components/scheduler/child/scheduler_helper.cc b/components/scheduler/child/scheduler_helper.cc |
index cb2d191ee2860f15286c881df60117ac61a86821..f0f80e9c8504f034d2c20266f931ec07dc0e4665 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" |
@@ -33,6 +34,10 @@ 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), |
+ in_preshutdown_(false), |
quiescence_monitored_task_queue_mask_( |
((1ull << total_task_queue_count) - 1ull) & |
~(1ull << QueueId::IDLE_TASK_QUEUE) & |
@@ -63,18 +68,16 @@ SchedulerHelper::SchedulerHelper( |
weak_scheduler_ptr_), |
tracing_category)); |
- task_queue_selector_->SetQueuePriority( |
- QueueId::CONTROL_TASK_QUEUE, |
- PrioritizingTaskQueueSelector::CONTROL_PRIORITY); |
+ SetQueuePriority(QueueId::CONTROL_TASK_QUEUE, |
+ PrioritizingTaskQueueSelector::CONTROL_PRIORITY); |
- task_queue_selector_->SetQueuePriority( |
- QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE, |
- PrioritizingTaskQueueSelector::CONTROL_PRIORITY); |
+ SetQueuePriority(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE, |
+ PrioritizingTaskQueueSelector::CONTROL_PRIORITY); |
task_queue_manager_->SetPumpPolicy( |
QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE, |
TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
- task_queue_selector_->DisableQueue(QueueId::IDLE_TASK_QUEUE); |
+ DisableQueue(QueueId::IDLE_TASK_QUEUE); |
task_queue_manager_->SetPumpPolicy(QueueId::IDLE_TASK_QUEUE, |
TaskQueueManager::PumpPolicy::MANUAL); |
@@ -96,6 +99,20 @@ SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { |
SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { |
} |
+void SchedulerHelper::PreShutdown() { |
+ CheckOnValidThread(); |
+ DCHECK(!in_preshutdown_); |
+ TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdown"); |
+ // Disable everything except the shutdown task queue. |
+ for (size_t i = 0; i < total_task_queue_count_; i++) { |
+ if (i == SHUTDOWN_TASK_QUEUE) |
+ continue; |
+ DisableQueue(i); |
+ } |
+ // Ensure that the queues don't get re-enabled. |
+ in_preshutdown_ = true; |
+} |
+ |
void SchedulerHelper::Shutdown() { |
CheckOnValidThread(); |
task_queue_manager_.reset(); |
@@ -113,6 +130,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_; |
} |
@@ -254,9 +276,8 @@ void SchedulerHelper::StartIdlePeriod(IdlePeriodState new_state, |
CheckOnValidThread(); |
DCHECK(IsInIdlePeriod(new_state)); |
- task_queue_selector_->EnableQueue( |
- QueueId::IDLE_TASK_QUEUE, |
- PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY); |
+ EnableQueue(QueueId::IDLE_TASK_QUEUE, |
+ PrioritizingTaskQueueSelector::BEST_EFFORT_PRIORITY); |
task_queue_manager_->PumpQueue(QueueId::IDLE_TASK_QUEUE); |
idle_period_state_ = new_state; |
@@ -293,7 +314,7 @@ void SchedulerHelper::EndIdlePeriod() { |
TRACE_EVENT_ASYNC_END0(tracing_category_, idle_period_tracing_name_, this); |
} |
- task_queue_selector_->DisableQueue(QueueId::IDLE_TASK_QUEUE); |
+ DisableQueue(QueueId::IDLE_TASK_QUEUE); |
idle_period_state_ = IdlePeriodState::NOT_IN_IDLE_PERIOD; |
idle_period_deadline_ = base::TimeTicks(); |
} |
@@ -355,6 +376,8 @@ void SchedulerHelper::SetQueuePriority( |
size_t queue_index, |
PrioritizingTaskQueueSelector::QueuePriority priority) { |
CheckOnValidThread(); |
+ if (in_preshutdown_) |
+ return; |
return task_queue_selector_->SetQueuePriority(queue_index, priority); |
} |
@@ -362,11 +385,15 @@ void SchedulerHelper::EnableQueue( |
size_t queue_index, |
PrioritizingTaskQueueSelector::QueuePriority priority) { |
CheckOnValidThread(); |
+ if (in_preshutdown_) |
+ return; |
task_queue_selector_->EnableQueue(queue_index, priority); |
} |
void SchedulerHelper::DisableQueue(size_t queue_index) { |
CheckOnValidThread(); |
+ if (in_preshutdown_) |
+ return; |
task_queue_selector_->DisableQueue(queue_index); |
} |
@@ -382,6 +409,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: |