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