Index: base/task_scheduler/sequence.cc |
diff --git a/base/task_scheduler/sequence.cc b/base/task_scheduler/sequence.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..892ac09513b55c663d6a9a08b8442dbb3c468157 |
--- /dev/null |
+++ b/base/task_scheduler/sequence.cc |
@@ -0,0 +1,65 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/task_scheduler/sequence.h" |
+ |
+#include <utility> |
+ |
+#include "base/logging.h" |
+ |
+namespace base { |
+namespace task_scheduler { |
+ |
+Sequence::Sequence() : num_tasks_per_priority_() {} |
+ |
+void Sequence::PushTask(scoped_ptr<Task> task, size_t* prev_num_tasks) { |
+ AutoSchedulerLock auto_lock(lock_); |
+ DCHECK(task.get()); |
fdoray
2016/02/11 17:30:33
DCHECK first?
+ DCHECK(prev_num_tasks);
robliao
2016/02/11 22:49:30
Both DCHECKs are unnecessary as both will crash be
fdoray
2016/02/12 04:16:19
Done.
|
+ |
+ ++num_tasks_per_priority_[static_cast<TaskPriorityUnderlyingType>( |
+ task->traits.priority())]; |
+ *prev_num_tasks = queue_.size(); |
+ queue_.push(std::move(task)); |
+} |
+ |
+const Task* Sequence::PeekTask() { |
+ AutoSchedulerLock auto_lock(lock_); |
+ |
+ if (queue_.empty()) |
+ return nullptr; |
+ |
+ return queue_.front().get(); |
+} |
+ |
+void Sequence::PopTask(size_t* new_num_tasks) { |
+ DCHECK(new_num_tasks); |
+ AutoSchedulerLock auto_lock(lock_); |
+ DCHECK(!queue_.empty()); |
+ |
+ --num_tasks_per_priority_[static_cast<TaskPriorityUnderlyingType>( |
+ queue_.front()->traits.priority())]; |
+ queue_.pop(); |
+ *new_num_tasks = queue_.size(); |
+} |
+ |
+SequenceSortKey Sequence::GetSortKey() { |
+ AutoSchedulerLock auto_lock(lock_); |
+ DCHECK(!queue_.empty()); |
+ |
+ // Find the highest task priority in the sequence. |
+ TaskPriority priority = TaskPriority::BACKGROUND; |
+ for (TaskPriorityUnderlyingType i = kNumTaskPriorities - 1; i >= 0; --i) { |
+ if (num_tasks_per_priority_[i] > 0) { |
+ priority = static_cast<TaskPriority>(i); |
+ break; |
+ } |
+ } |
+ |
+ return SequenceSortKey(priority, queue_.front()->post_time); |
+} |
+ |
+Sequence::~Sequence() = default; |
+ |
+} // namespace task_scheduler |
+} // namespace base |