| // 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_ |