Index: components/scheduler/base/task_queue_manager.cc |
diff --git a/components/scheduler/base/task_queue_manager.cc b/components/scheduler/base/task_queue_manager.cc |
index 584eb703646e0173c5e79b748993e49a56760677..4e31a868176c71e584d2a8d48338b8c57854711a 100644 |
--- a/components/scheduler/base/task_queue_manager.cc |
+++ b/components/scheduler/base/task_queue_manager.cc |
@@ -48,6 +48,7 @@ TaskQueueManager::TaskQueueManager( |
disabled_by_default_tracing_category), |
disabled_by_default_verbose_tracing_category_( |
disabled_by_default_verbose_tracing_category), |
+ currently_executing_task_queue_(nullptr), |
observer_(nullptr), |
deletion_sentinel_(new DeletionSentinel()), |
weak_factory_(this) { |
@@ -218,12 +219,8 @@ void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) { |
// TODO(alexclarke): Consider refactoring the above loop to terminate only |
// when there's no more work left to be done, rather than posting a |
// continuation task. |
- if (!selector_.EnabledWorkQueuesEmpty() || TryAdvanceTimeDomains()) { |
+ if (!selector_.EnabledWorkQueuesEmpty() || TryAdvanceTimeDomains()) |
MaybeScheduleImmediateWork(FROM_HERE); |
- } else { |
- // Tell the task runner we have no more work. |
- delegate_->OnNoMoreImmediateWork(); |
- } |
} |
bool TaskQueueManager::TryAdvanceTimeDomains() { |
@@ -280,6 +277,12 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue( |
} |
TRACE_EVENT1(tracing_category_, |
"TaskQueueManager::RunTask", "queue", queue->GetName()); |
+ // NOTE when TaskQueues get unregistered a reference ends up getting retained |
+ // by |queues_to_delete_| which is cleared at the top of |DoWork|. This means |
+ // we are OK to use raw pointers here. |
+ internal::TaskQueueImpl* prev_executing_task_queue = |
+ currently_executing_task_queue_; |
+ currently_executing_task_queue_ = queue; |
task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); |
// Detect if the TaskQueueManager just got deleted. If this happens we must |
@@ -287,6 +290,8 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue( |
if (protect->HasOneRef()) |
return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; |
+ currently_executing_task_queue_ = prev_executing_task_queue; |
+ |
if (queue->GetShouldNotifyObservers()) { |
FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, |
DidProcessTask(pending_task)); |