Index: base/task_scheduler/sequence.cc |
diff --git a/base/task_scheduler/sequence.cc b/base/task_scheduler/sequence.cc |
index 86e99f0a4c390907f101f99cf6a08d29b86f08a7..59621364b13fba17432009184a441739cf96e7f1 100644 |
--- a/base/task_scheduler/sequence.cc |
+++ b/base/task_scheduler/sequence.cc |
@@ -26,37 +26,33 @@ bool Sequence::PushTask(std::unique_ptr<Task> task) { |
return queue_.size() == 1; |
} |
-const Task* Sequence::PeekTask() const { |
+std::unique_ptr<Task> Sequence::TakeTask() { |
AutoSchedulerLock auto_lock(lock_); |
- if (queue_.empty()) |
+ if (queue_.empty() || !queue_.front()) |
gab
2016/10/07 19:51:08
I don't think we should allow calling TakeTask() w
fdoray
2016/10/07 20:30:30
Done.
|
return nullptr; |
- return queue_.front().get(); |
-} |
- |
-bool Sequence::PopTask() { |
- // Delete the popped task outside the scope of |lock_|. This prevents a double |
- // acquisition of |lock_| if the task's destructor tries to post a task to |
- // this Sequence and reduces contention. |
- std::unique_ptr<Task> delete_outside_lock_scope; |
- bool sequence_empty_after_pop = false; |
- |
- { |
- AutoSchedulerLock auto_lock(lock_); |
- DCHECK(!queue_.empty()); |
+ const int priority_index = |
+ static_cast<int>(queue_.front()->traits.priority()); |
+ DCHECK_GT(num_tasks_per_priority_[priority_index], 0U); |
+ --num_tasks_per_priority_[priority_index]; |
- const int priority_index = |
- static_cast<int>(queue_.front()->traits.priority()); |
- DCHECK_GT(num_tasks_per_priority_[priority_index], 0U); |
- --num_tasks_per_priority_[priority_index]; |
+ return std::move(queue_.front()); |
+} |
- delete_outside_lock_scope = std::move(queue_.front()); |
- queue_.pop(); |
- sequence_empty_after_pop = queue_.empty(); |
- } |
+TaskTraits Sequence::GetFrontTaskTraits() const { |
+ AutoSchedulerLock auto_lock(lock_); |
+ DCHECK(!queue_.empty()); |
+ DCHECK(queue_.front()); |
+ return queue_.front()->traits; |
+} |
- return sequence_empty_after_pop; |
+bool Sequence::RemoveFrontSlot() { |
+ AutoSchedulerLock auto_lock(lock_); |
+ DCHECK(!queue_.empty()); |
+ DCHECK(!queue_.front()); |
+ queue_.pop(); |
+ return queue_.empty(); |
} |
SequenceSortKey Sequence::GetSortKey() const { |