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..6fcce57594a471484d9e2c1af8ae65c00c72ed26 100644 |
--- a/base/task_scheduler/scheduler_worker_thread.cc |
+++ b/base/task_scheduler/scheduler_worker_thread.cc |
@@ -74,7 +74,15 @@ 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, it |
+ // will be enqueued when a Task is added to it. |
robliao
2016/04/08 17:21:39
Nit: Technically, for the empty case...
If it is e
fdoray
2016/04/08 17:49:12
Done.
|
+ 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_| |