Index: base/task_scheduler/scheduler_worker_thread.cc |
diff --git a/base/task_scheduler/scheduler_worker_thread.cc b/base/task_scheduler/scheduler_worker_thread.cc |
index 49dde51d6a7b036675fd47d645df60e0c0e4e242..1a8354fd5c71901f91521c64a13bc1337917d683 100644 |
--- a/base/task_scheduler/scheduler_worker_thread.cc |
+++ b/base/task_scheduler/scheduler_worker_thread.cc |
@@ -74,7 +74,16 @@ void SchedulerWorkerThread::ThreadMain() { |
} |
task_tracker_->RunTask(sequence->PeekTask()); |
- delegate_->RanTaskFromSequence(std::move(sequence)); |
+ |
+ const bool sequence_became_empty = sequence->PopTask(); |
+ |
+ // If |sequence| isn't empty immediately after the pop, enqueue it to |
+ // maintain the invariant that a non-empty Sequence is always referenced by |
+ // either a PriorityQueue or a SchedulerWorkerThread. If it is empty and |
+ // there are live references to it, it will be enqueued when a Task is added |
+ // to it. Otherwise, it will be destroyed at the end of this scope. |
+ if (!sequence_became_empty) |
+ delegate_->EnqueueSequence(std::move(sequence)); |
// Calling WakeUp() guarantees that this SchedulerWorkerThread will run |
// Tasks from Sequences returned by the GetWork() method of |delegate_| |