// 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_GLFW_EVENT_LOOP_H_ #define FLUTTER_SHELL_PLATFORM_GLFW_EVENT_LOOP_H_ #include #include #include #include #include #include #include "flutter/shell/platform/embedder/embedder.h" namespace flutter { // An abstract event loop. class EventLoop { public: using TaskExpiredCallback = std::function; // Creates an event loop running on the given thread, calling // |on_task_expired| to run tasks. EventLoop(std::thread::id main_thread_id, const TaskExpiredCallback& on_task_expired); virtual ~EventLoop(); // Disallow copy. EventLoop(const EventLoop&) = delete; EventLoop& operator=(const EventLoop&) = delete; // Returns if the current thread is the thread used by this event loop. bool RunsTasksOnCurrentThread() const; // Waits for the next event, processes it, and returns. // // Expired engine events, if any, are processed as well. The optional // timeout should only be used when events not managed by this loop need to be // processed in a polling manner. void WaitForEvents( std::chrono::nanoseconds max_wait = std::chrono::nanoseconds::max()); // Posts a Flutter engine task to the event loop for delayed execution. void PostTask(FlutterTask flutter_task, uint64_t flutter_target_time_nanos); protected: using TaskTimePoint = std::chrono::steady_clock::time_point; // Returns the timepoint corresponding to a Flutter task time. static TaskTimePoint TimePointFromFlutterTime( uint64_t flutter_target_time_nanos); // Returns the mutex used to control the task queue. Subclasses may safely // lock this mutex in the abstract methods below. std::mutex& GetTaskQueueMutex() { return task_queue_mutex_; } // Waits until the given time, or a Wake() call. virtual void WaitUntil(const TaskTimePoint& time) = 0; // Wakes the main thread from a WaitUntil call. virtual void Wake() = 0; struct Task { uint64_t order; TaskTimePoint fire_time; FlutterTask task; struct Comparer { bool operator()(const Task& a, const Task& b) { if (a.fire_time == b.fire_time) { return a.order > b.order; } return a.fire_time > b.fire_time; } }; }; std::thread::id main_thread_id_; TaskExpiredCallback on_task_expired_; std::mutex task_queue_mutex_; std::priority_queue, Task::Comparer> task_queue_; }; } // namespace flutter #endif // FLUTTER_SHELL_PLATFORM_GLFW_EVENT_LOOP_H_