| 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_|
|
|
|