| // Copyright 2013 The Flutter 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 FLUTTER_FML_TASK_SOURCE_H_ | |
| #define FLUTTER_FML_TASK_SOURCE_H_ | |
| #include "flutter/fml/delayed_task.h" | |
| #include "flutter/fml/task_queue_id.h" | |
| #include "flutter/fml/task_source_grade.h" | |
| namespace fml { | |
| class MessageLoopTaskQueues; | |
| /** | |
| * A Source of tasks for the `MessageLoopTaskQueues` task dispatcher. This is a | |
| * wrapper around a primary and secondary task heap with the difference between | |
| * them being that the secondary task heap can be paused and resumed by the task | |
| * dispatcher. `TaskSourceGrade` determines what task heap the task is assigned | |
| * to. | |
| * | |
| * Registering Tasks | |
| * ----------------- | |
| * The task dispatcher associates a task source with each `TaskQueueID`. When | |
| * the user of the task dispatcher registers a task, the task is in-turn | |
| * registered with the `TaskSource` corresponding to the `TaskQueueID`. | |
| * | |
| * Processing Tasks | |
| * ---------------- | |
| * Task dispatcher provides the event loop a way to acquire tasks to run via | |
| * `GetNextTaskToRun`. Task dispatcher asks the underlying `TaskSource` for the | |
| * next task. | |
| */ | |
| class TaskSource { | |
| public: | |
| struct TopTask { | |
| TaskQueueId task_queue_id; | |
| const DelayedTask& task; | |
| }; | |
| /// Construts a TaskSource with the given `task_queue_id`. | |
| explicit TaskSource(TaskQueueId task_queue_id); | |
| ~TaskSource(); | |
| /// Drops the pending tasks from both primary and secondary task heaps. | |
| void ShutDown(); | |
| /// Adds a task to the corresponding task heap as dictated by the | |
| /// `TaskSourceGrade` of the `DelayedTask`. | |
| void RegisterTask(const DelayedTask& task); | |
| /// Pops the task heap corresponding to the `TaskSourceGrade`. | |
| void PopTask(TaskSourceGrade grade); | |
| /// Returns the number of pending tasks. Excludes the tasks from the secondary | |
| /// heap if it's paused. | |
| size_t GetNumPendingTasks() const; | |
| /// Returns true if `GetNumPendingTasks` is zero. | |
| bool IsEmpty() const; | |
| /// Returns the top task based on scheduled time, taking into account whether | |
| /// the secondary heap has been paused or not. | |
| TopTask Top() const; | |
| /// Pause providing tasks from secondary task heap. | |
| void PauseSecondary(); | |
| /// Resume providing tasks from secondary task heap. | |
| void ResumeSecondary(); | |
| private: | |
| const fml::TaskQueueId task_queue_id_; | |
| fml::DelayedTaskQueue primary_task_queue_; | |
| fml::DelayedTaskQueue secondary_task_queue_; | |
| int secondary_pause_requests_ = 0; | |
| FML_DISALLOW_COPY_ASSIGN_AND_MOVE(TaskSource); | |
| }; | |
| } // namespace fml | |
| #endif // FLUTTER_FML_TASK_SOURCE_H_ |