// 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/task_scheduler/sequence.h" #include #include "base/critical_closure.h" #include "base/logging.h" #include "base/time/time.h" namespace base { namespace internal { Sequence::Sequence(const TaskTraits& traits) : traits_(traits) {} bool Sequence::PushTask(Task task) { // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167 // for details. CHECK(task.task); DCHECK(task.sequenced_time.is_null()); task.sequenced_time = base::TimeTicks::Now(); task.task = traits_.shutdown_behavior() == TaskShutdownBehavior::BLOCK_SHUTDOWN ? MakeCriticalClosure(std::move(task.task)) : std::move(task.task); AutoSchedulerLock auto_lock(lock_); queue_.push(std::move(task)); // Return true if the sequence was empty before the push. return queue_.size() == 1; } Optional Sequence::TakeTask() { AutoSchedulerLock auto_lock(lock_); DCHECK(!queue_.empty()); DCHECK(queue_.front().task); return std::move(queue_.front()); } bool Sequence::Pop() { AutoSchedulerLock auto_lock(lock_); DCHECK(!queue_.empty()); DCHECK(!queue_.front().task); queue_.pop(); return queue_.empty(); } SequenceSortKey Sequence::GetSortKey() const { base::TimeTicks next_task_sequenced_time; { AutoSchedulerLock auto_lock(lock_); DCHECK(!queue_.empty()); // Save the sequenced time of the next task in the sequence. next_task_sequenced_time = queue_.front().sequenced_time; } return SequenceSortKey(traits_.priority(), next_task_sequenced_time); } Sequence::~Sequence() = default; } // namespace internal } // namespace base