mirror of
https://github.com/encounter/engine.git
synced 2026-03-30 11:09:55 -07:00
89e395853c
Moved our code to passing functions by const ref
104 lines
3.9 KiB
C++
104 lines
3.9 KiB
C++
// 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 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_;
|
|
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_
|