// Copyright 2018 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. #ifndef BASE_MESSAGE_LOOP_SEQUENCED_TASK_SOURCE_H_ #define BASE_MESSAGE_LOOP_SEQUENCED_TASK_SOURCE_H_ #include "base/callback.h" #include "base/pending_task.h" #include "base/time/time.h" namespace base { // A source of tasks to be executed sequentially. Unless specified otherwise, // methods below are not thread-safe (must be called from the executing // sequence). // TODO(scheduler-dev): Coalesce with // base::sequence_manager::SequencedTaskSource. class SequencedTaskSource { public: class Observer { public: virtual ~Observer() = default; // Notifies this Observer that |task| is about to be enqueued in the // SequencedTaskSource it observes. // WillQueueTask() may be invoked from any thread. virtual void WillQueueTask(PendingTask* task) = 0; // Notifies this Observer that a task was enqueued in the // SequencedTaskSource it observes. |was_empty| is true if the task source // was empty (i.e. |!HasTasks()|) before this task was posted. // DidQueueTask() may be invoked from any thread. virtual void DidQueueTask(bool was_empty) = 0; }; virtual ~SequencedTaskSource() = default; // Take a next task to run from a sequence. Must only be called if // HasTasks() returns true. virtual PendingTask TakeTask() = 0; // Returns true if this SequencedTaskSource will return a task from the next // TakeTask() call. virtual bool HasTasks() = 0; // Injects |task| at the end of this SequencedTaskSource (such that it will be // the last task returned by TakeTask() if no other task are posted after this // point). TODO(gab): This is only required to support clearing tasks on // shutdown, maybe leaking tasks on shutdown is a better alternative. virtual void InjectTask(OnceClosure task) = 0; }; } // namespace base #endif // BASE_MESSAGE_LOOP_SEQUENCED_TASK_SOURCE_H_