Chromium Code Reviews| 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 |