|  | // 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_TASK_SEQUENCE_MANAGER_SEQUENCED_TASK_SOURCE_H_ | 
|  | #define BASE_TASK_SEQUENCE_MANAGER_SEQUENCED_TASK_SOURCE_H_ | 
|  |  | 
|  | #include "base/optional.h" | 
|  | #include "base/pending_task.h" | 
|  | #include "base/task/sequence_manager/lazy_now.h" | 
|  | #include "base/task/sequence_manager/tasks.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace sequence_manager { | 
|  | namespace internal { | 
|  |  | 
|  | // Interface to pass tasks to ThreadController. | 
|  | class SequencedTaskSource { | 
|  | public: | 
|  | enum class SelectTaskOption { kDefault, kSkipDelayedTask }; | 
|  |  | 
|  | virtual ~SequencedTaskSource() = default; | 
|  |  | 
|  | // Returns the next task to run from this source or nullptr if | 
|  | // there're no more tasks ready to run. If a task is returned, | 
|  | // DidRunTask() must be invoked before the next call to SelectNextTask(). | 
|  | // |option| allows control on which kind of tasks can be selected. | 
|  | virtual Task* SelectNextTask( | 
|  | SelectTaskOption option = SelectTaskOption::kDefault) = 0; | 
|  |  | 
|  | // Notifies this source that the task previously obtained | 
|  | // from SelectNextTask() has been completed. | 
|  | virtual void DidRunTask() = 0; | 
|  |  | 
|  | // Returns the delay till the next task or TimeDelta::Max() | 
|  | // if there are no tasks left. |option| allows control on which kind of tasks | 
|  | // can be selected. | 
|  | virtual TimeDelta DelayTillNextTask( | 
|  | LazyNow* lazy_now, | 
|  | SelectTaskOption option = SelectTaskOption::kDefault) const = 0; | 
|  |  | 
|  | // Return true if there are any pending tasks in the task source which require | 
|  | // high resolution timing. | 
|  | virtual bool HasPendingHighResolutionTasks() = 0; | 
|  |  | 
|  | // Called when we have run out of immediate work.  If more immediate work | 
|  | // becomes available as a result of any processing done by this callback, | 
|  | // return true to schedule a future DoWork. | 
|  | virtual bool OnSystemIdle() = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace sequence_manager | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TASK_SEQUENCE_MANAGER_SEQUENCED_TASK_SOURCE_H_ |