| // 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_SHELL_PLATFORM_EMBEDDER_EMBEDDER_TASK_RUNNER_H_ |
| #define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_TASK_RUNNER_H_ |
| |
| #include <mutex> |
| #include <unordered_map> |
| |
| #include "flutter/fml/macros.h" |
| #include "flutter/fml/task_runner.h" |
| |
| namespace flutter { |
| |
| //------------------------------------------------------------------------------ |
| /// A task runner which delegates responsibility of task execution to an |
| /// embedder. This is done by managing a dispatch table to the embedder. |
| /// |
| class EmbedderTaskRunner final : public fml::TaskRunner { |
| public: |
| //---------------------------------------------------------------------------- |
| /// @brief A |
| /// |
| struct DispatchTable { |
| //-------------------------------------------------------------------------- |
| /// Delegates responsibility of deferred task execution to the embedder. |
| /// Once the embedder gets the task, it must call |
| /// `EmbedderTaskRunner::PostTask` with the supplied `task_baton` on the |
| /// correct thread after the tasks `target_time` point expires. |
| /// |
| std::function<void(EmbedderTaskRunner* task_runner, |
| uint64_t task_baton, |
| fml::TimePoint target_time)> |
| post_task_callback; |
| //-------------------------------------------------------------------------- |
| /// Asks the embedder if tasks posted to it on this task runner via the |
| /// `post_task_callback` will be executed (after task expiry) on the calling |
| /// thread. |
| /// |
| std::function<bool(void)> runs_task_on_current_thread_callback; |
| }; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Create a task runner with a dispatch table for delegation of |
| /// task runner responsibility to the embedder. When embedders |
| /// specify task runner dispatch tables that service tasks on the |
| /// same thread, they also must ensure that their |
| /// `embedder_idetifier`s match. This allows the engine to |
| /// determine task runner equality without actually posting tasks |
| /// to the task runner. |
| /// |
| /// @param[in] table The task runner dispatch table. |
| /// @param[in] embedder_identifier The embedder identifier |
| /// |
| EmbedderTaskRunner(DispatchTable table, size_t embedder_identifier); |
| |
| // |fml::TaskRunner| |
| ~EmbedderTaskRunner() override; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief The unique identifier provided by the embedder for the task |
| /// runner. Embedders whose dispatch tables service tasks on the |
| /// same underlying OS thread must ensure that their identifiers |
| /// match. This allows the engine to determine task runner |
| /// equality without posting tasks on the thread. |
| /// |
| /// @return The embedder identifier. |
| /// |
| size_t GetEmbedderIdentifier() const; |
| |
| bool PostTask(uint64_t baton); |
| |
| private: |
| const size_t embedder_identifier_; |
| DispatchTable dispatch_table_; |
| std::mutex tasks_mutex_; |
| uint64_t last_baton_ = 0; |
| std::unordered_map<uint64_t, fml::closure> pending_tasks_; |
| fml::TaskQueueId placeholder_id_; |
| |
| // |fml::TaskRunner| |
| void PostTask(const fml::closure& task) override; |
| |
| // |fml::TaskRunner| |
| void PostTaskForTime(const fml::closure& task, |
| fml::TimePoint target_time) override; |
| |
| // |fml::TaskRunner| |
| void PostDelayedTask(const fml::closure& task, fml::TimeDelta delay) override; |
| |
| // |fml::TaskRunner| |
| bool RunsTasksOnCurrentThread() override; |
| |
| // |fml::TaskRunner| |
| fml::TaskQueueId GetTaskQueueId() override; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTaskRunner); |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_TASK_RUNNER_H_ |