5#define FML_USED_ON_EMBEDDER
16std::set<intptr_t> EmbedderThreadHost::active_runners_;
17std::mutex EmbedderThreadHost::active_runners_mutex_;
32static std::pair<bool, fml::RefPtr<EmbedderTaskRunner>>
34 if (description ==
nullptr) {
41 if (
SAFE_ACCESS(description, runs_task_on_current_thread_callback,
nullptr) ==
43 FML_LOG(ERROR) <<
"FlutterTaskRunnerDescription.runs_task_on_current_"
44 "thread_callback was nullptr.";
48 if (
SAFE_ACCESS(description, post_task_callback,
nullptr) ==
nullptr) {
50 <<
"FlutterTaskRunnerDescription.post_task_callback was nullptr.";
58 auto runs_task_on_current_thread_callback_c =
62 if (
SAFE_ACCESS(description, destruction_callback,
nullptr) !=
nullptr) {
77 post_task_callback_c(task, target_time.ToEpochDelta().ToNanoseconds(),
80 .runs_task_on_current_thread_callback =
81 [runs_task_on_current_thread_callback_c,
user_data]() ->
bool {
82 return runs_task_on_current_thread_callback_c(
user_data);
84 .destruction_callback =
90 return {
true, fml::MakeRefCounted<EmbedderTaskRunner>(
91 task_runner_dispatch_table,
95std::unique_ptr<EmbedderThreadHost>
101 CreateEmbedderManagedThreadHost(custom_task_runners, config_setter);
111 if (custom_task_runners ==
nullptr) {
112 auto host = CreateEngineManagedThreadHost(config_setter);
138std::unique_ptr<EmbedderThreadHost>
139EmbedderThreadHost::CreateEmbedderManagedThreadHost(
142 if (custom_task_runners ==
nullptr) {
146 auto thread_host_config = ThreadHost::ThreadHostConfig(config_setter);
156 SAFE_ACCESS(custom_task_runners, ui_task_runner,
nullptr));
158 SAFE_ACCESS(custom_task_runners, platform_task_runner,
nullptr));
160 SAFE_ACCESS(custom_task_runners, render_task_runner,
nullptr));
162 if (!platform_task_runner_pair.first || !render_task_runner_pair.first) {
170 if (!ui_task_runner_pair.second) {
177 if (!render_task_runner_pair.second) {
184 if (platform_task_runner_pair.second && render_task_runner_pair.second) {
185 if (platform_task_runner_pair.second->GetEmbedderIdentifier() ==
186 render_task_runner_pair.second->GetEmbedderIdentifier()) {
187 render_task_runner_pair.second = platform_task_runner_pair.second;
193 if (platform_task_runner_pair.second && ui_task_runner_pair.second) {
194 if (platform_task_runner_pair.second->GetEmbedderIdentifier() ==
195 ui_task_runner_pair.second->GetEmbedderIdentifier()) {
196 ui_task_runner_pair.second = platform_task_runner_pair.second;
202 ThreadHost thread_host(thread_host_config);
206 auto platform_task_runner = platform_task_runner_pair.second
208 platform_task_runner_pair.second)
213 auto render_task_runner = render_task_runner_pair.second
215 render_task_runner_pair.second)
216 : thread_host.raster_thread->GetTaskRunner();
218 auto ui_task_runner = ui_task_runner_pair.second
220 ui_task_runner_pair.second)
221 : thread_host.ui_thread->GetTaskRunner();
225 platform_task_runner,
228 thread_host.io_thread->GetTaskRunner()
231 if (!task_runners.IsValid()) {
235 std::set<fml::RefPtr<EmbedderTaskRunner>> embedder_task_runners;
237 if (platform_task_runner_pair.second) {
238 embedder_task_runners.insert(platform_task_runner_pair.second);
241 if (render_task_runner_pair.second) {
242 embedder_task_runners.insert(render_task_runner_pair.second);
245 if (ui_task_runner_pair.second) {
246 embedder_task_runners.insert(ui_task_runner_pair.second);
249 auto embedder_host = std::make_unique<EmbedderThreadHost>(
250 std::move(thread_host), std::move(task_runners),
251 std::move(embedder_task_runners));
253 if (embedder_host->IsValid()) {
254 return embedder_host;
262std::unique_ptr<EmbedderThreadHost>
263EmbedderThreadHost::CreateEngineManagedThreadHost(
266 auto thread_host_config = ThreadHost::ThreadHostConfig(config_setter);
276 ThreadHost thread_host(thread_host_config);
285 platform_task_runner,
286 thread_host.raster_thread->GetTaskRunner(),
287 thread_host.ui_thread->GetTaskRunner(),
288 thread_host.io_thread->GetTaskRunner()
291 if (!task_runners.IsValid()) {
295 std::set<fml::RefPtr<EmbedderTaskRunner>> empty_embedder_task_runners;
297 auto embedder_host = std::make_unique<EmbedderThreadHost>(
298 std::move(thread_host), std::move(task_runners),
299 empty_embedder_task_runners);
301 if (embedder_host->IsValid()) {
302 return embedder_host;
312 : host_(
std::move(
host)), runners_(runners) {
313 std::lock_guard guard(active_runners_mutex_);
314 for (
const auto& runner : embedder_task_runners) {
315 runners_map_[runner->unique_id()] = runner;
316 active_runners_.insert(runner->unique_id());
323 std::lock_guard guard(active_runners_mutex_);
324 for (
const auto& runner : runners_map_) {
325 active_runners_.erase(runner.first);
330 std::lock_guard guard(active_runners_mutex_);
331 return active_runners_.find(runner) != active_runners_.end();
343 auto found = runners_map_.find(runner);
344 if (found == runners_map_.end()) {
347 return found->second->PostTask(task);
bool PostTask(intptr_t runner, uint64_t task) const
static bool RunnerIsValid(intptr_t runner)
const flutter::TaskRunners & GetTaskRunners() const
void InvalidateActiveRunners()
static std::unique_ptr< EmbedderThreadHost > CreateEmbedderOrEngineManagedThreadHost(const FlutterCustomTaskRunners *custom_task_runners, const flutter::ThreadConfigSetter &config_setter=fml::Thread::SetCurrentThreadName)
EmbedderThreadHost(ThreadHost host, const flutter::TaskRunners &runners, const std::set< fml::RefPtr< EmbedderTaskRunner > > &embedder_task_runners)
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
ThreadPriority
Valid values for priority of Thread.
@ kRaster
Suitable for thread which raster data.
@ kBackground
Suitable for threads that shouldn't disrupt high priority work.
@ kDisplay
Suitable for threads which generate data for the display.
void(* VoidCallback)(void *)
struct _FlutterTaskRunner * FlutterTaskRunner
#define SAFE_ACCESS(pointer, member, default_value)
#define FML_LOG(severity)
fml::Thread::ThreadConfig MakeThreadConfig(flutter::ThreadHost::Type type, fml::Thread::ThreadPriority priority)
static fml::RefPtr< fml::TaskRunner > GetCurrentThreadTaskRunner()
constexpr const char * kFlutterThreadName
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service host
fml::Thread::ThreadConfigSetter ThreadConfigSetter
static std::pair< bool, fml::RefPtr< EmbedderTaskRunner > > CreateEmbedderTaskRunner(const FlutterTaskRunnerDescription *description)
Attempts to create a task runner from an embedder task runner description. The first boolean in the p...
BoolCallback runs_task_on_current_thread_callback
FlutterTaskRunnerPostTaskCallback post_task_callback
VoidCallback destruction_callback
The callback invoked when the task runner is destroyed.
std::function< void(EmbedderTaskRunner *task_runner, uint64_t task_baton, fml::TimePoint target_time)> post_task_callback
static std::string MakeThreadName(Type type, const std::string &prefix)
Use the prefix and thread type to generator a thread name.
The collection of all the threads used by the engine.
The ThreadConfig is the thread info include thread name, thread priority.