Flutter Engine
 
Loading...
Searching...
No Matches
message_loop_task_queues.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_FML_MESSAGE_LOOP_TASK_QUEUES_H_
6#define FLUTTER_FML_MESSAGE_LOOP_TASK_QUEUES_H_
7
8#include <map>
9#include <memory>
10#include <mutex>
11#include <set>
12#include <vector>
13
14#include "flutter/fml/closure.h"
16#include "flutter/fml/macros.h"
21
22namespace fml {
23
25
26/// A collection of tasks and observers associated with one TaskQueue.
27///
28/// Often a TaskQueue has a one-to-one relationship with a fml::MessageLoop,
29/// this isn't the case when TaskQueues are merged via
30/// \p fml::MessageLoopTaskQueues::Merge.
32 public:
33 using TaskObservers = std::map<intptr_t, fml::closure>;
36 std::unique_ptr<TaskSource> task_source;
37
38 /// Set of the TaskQueueIds which is owned by this TaskQueue. If the set is
39 /// empty, this TaskQueue does not own any other TaskQueues.
40 std::set<TaskQueueId> owner_of;
41
42 /// Identifies the TaskQueue that subsumes this TaskQueue. If it is kUnmerged
43 /// it indicates that this TaskQueue is not owned by any other TaskQueue.
45
47
49
50 private:
52};
53
54enum class FlushType {
55 kSingle,
56 kAll,
57};
58
59/// A singleton container for all tasks and observers associated with all
60/// fml::MessageLoops.
61///
62/// This also wakes up the loop at the required times.
63/// \see fml::MessageLoop
64/// \see fml::Wakeable
66 public:
67 // Lifecycle.
68
70
72
73 void Dispose(TaskQueueId queue_id);
74
75 void DisposeTasks(TaskQueueId queue_id);
76
77 // Tasks methods.
78
79 void RegisterTask(TaskQueueId queue_id,
80 const fml::closure& task,
81 fml::TimePoint target_time,
82 fml::TaskSourceGrade task_source_grade =
84
85 bool HasPendingTasks(TaskQueueId queue_id) const;
86
88
89 size_t GetNumPendingTasks(TaskQueueId queue_id) const;
90
92
93 // Observers methods.
94
95 void AddTaskObserver(TaskQueueId queue_id,
96 intptr_t key,
97 const fml::closure& callback);
98
99 void RemoveTaskObserver(TaskQueueId queue_id, intptr_t key);
100
101 std::vector<fml::closure> GetObserversToNotify(TaskQueueId queue_id) const;
102
103 // Misc.
104
105 void SetWakeable(TaskQueueId queue_id, fml::Wakeable* wakeable);
106
107 // Invariants for merge and un-merge
108 // 1. RegisterTask will always submit to the queue_id that is passed
109 // to it. It is not aware of whether a queue is merged or not. Same with
110 // task observers.
111 // 2. When we get the tasks to run now, we look at both the queue_ids
112 // for the owner and the subsumed task queues.
113 // 3. One TaskQueue can subsume multiple other TaskQueues. A TaskQueue can be
114 // in exactly one of the following three states:
115 // a. Be an owner of multiple other TaskQueues.
116 // b. Be subsumed by a TaskQueue (an owner can never be subsumed).
117 // c. Be independent, i.e, neither owner nor be subsumed.
118 //
119 // Methods currently aware of the merged state of the queues:
120 // HasPendingTasks, GetNextTaskToRun, GetNumPendingTasks
121 bool Merge(TaskQueueId owner, TaskQueueId subsumed);
122
123 // Will return false if the owner has not been merged before, or owner was
124 // subsumed by others, or subsumed wasn't subsumed by others, or owner
125 // didn't own the given subsumed queue id.
126 bool Unmerge(TaskQueueId owner, TaskQueueId subsumed);
127
128 /// Returns \p true if \p owner owns the \p subsumed task queue.
129 bool Owns(TaskQueueId owner, TaskQueueId subsumed) const;
130
131 // Returns the subsumed task queue if any or |TaskQueueId::kUnmerged|
132 // otherwise.
133 std::set<TaskQueueId> GetSubsumedTaskQueueId(TaskQueueId owner) const;
134
135 void PauseSecondarySource(TaskQueueId queue_id);
136
137 void ResumeSecondarySource(TaskQueueId queue_id);
138
139 private:
140 class MergedQueuesRunner;
141
143
145
146 void WakeUpUnlocked(TaskQueueId queue_id, fml::TimePoint time) const;
147
148 bool HasPendingTasksUnlocked(TaskQueueId queue_id) const;
149
150 TaskSource::TopTask PeekNextTaskUnlocked(TaskQueueId owner) const;
151
152 fml::TimePoint GetNextWakeTimeUnlocked(TaskQueueId queue_id) const;
153
154 mutable std::mutex queue_mutex_;
155 std::map<TaskQueueId, std::unique_ptr<TaskQueueEntry>> queue_entries_;
156
157 size_t task_queue_id_counter_ = 0;
158
159 std::atomic_int order_;
160
162};
163
164} // namespace fml
165
166#endif // FLUTTER_FML_MESSAGE_LOOP_TASK_QUEUES_H_
fml::closure GetNextTaskToRun(TaskQueueId queue_id, fml::TimePoint from_time)
bool HasPendingTasks(TaskQueueId queue_id) const
size_t GetNumPendingTasks(TaskQueueId queue_id) const
static TaskSourceGrade GetCurrentTaskSourceGrade()
static MessageLoopTaskQueues * GetInstance()
void ResumeSecondarySource(TaskQueueId queue_id)
void DisposeTasks(TaskQueueId queue_id)
bool Merge(TaskQueueId owner, TaskQueueId subsumed)
bool Unmerge(TaskQueueId owner, TaskQueueId subsumed)
void RegisterTask(TaskQueueId queue_id, const fml::closure &task, fml::TimePoint target_time, fml::TaskSourceGrade task_source_grade=fml::TaskSourceGrade::kUnspecified)
std::vector< fml::closure > GetObserversToNotify(TaskQueueId queue_id) const
void PauseSecondarySource(TaskQueueId queue_id)
bool Owns(TaskQueueId owner, TaskQueueId subsumed) const
Returns true if owner owns the subsumed task queue.
void AddTaskObserver(TaskQueueId queue_id, intptr_t key, const fml::closure &callback)
void RemoveTaskObserver(TaskQueueId queue_id, intptr_t key)
std::set< TaskQueueId > GetSubsumedTaskQueueId(TaskQueueId owner) const
void SetWakeable(TaskQueueId queue_id, fml::Wakeable *wakeable)
void Dispose(TaskQueueId queue_id)
std::set< TaskQueueId > owner_of
TaskQueueId created_for
std::unique_ptr< TaskSource > task_source
Wakeable * wakeable
TaskObservers task_observers
std::map< intptr_t, fml::closure > TaskObservers
TaskQueueId subsumed_by
static const size_t kUnmerged
FlutterDesktopBinaryReply callback
#define FML_DISALLOW_COPY_ASSIGN_AND_MOVE(TypeName)
Definition macros.h:31
static const TaskQueueId kUnmerged
std::function< void()> closure
Definition closure.h:14
@ kUnspecified
The absence of a specialized TaskSourceGrade.