| // 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. |
| |
| #include "flutter/shell/platform/glfw/glfw_event_loop.h" |
| |
| #include <GLFW/glfw3.h> |
| |
| #include <atomic> |
| #include <utility> |
| |
| namespace flutter { |
| |
| GLFWEventLoop::GLFWEventLoop(std::thread::id main_thread_id, |
| const TaskExpiredCallback& on_task_expired) |
| : EventLoop(main_thread_id, std::move(on_task_expired)) {} |
| |
| GLFWEventLoop::~GLFWEventLoop() = default; |
| |
| void GLFWEventLoop::WaitUntil(const TaskTimePoint& time) { |
| const auto now = TaskTimePoint::clock::now(); |
| |
| // Make sure the seconds are not integral. |
| using Seconds = std::chrono::duration<double, std::ratio<1>>; |
| const auto duration_to_wait = std::chrono::duration_cast<Seconds>(time - now); |
| |
| if (duration_to_wait.count() > 0.0) { |
| ::glfwWaitEventsTimeout(duration_to_wait.count()); |
| } else { |
| // Avoid engine task priority inversion by making sure GLFW events are |
| // always processed even when there is no need to wait for pending engine |
| // tasks. |
| ::glfwPollEvents(); |
| } |
| } |
| |
| void GLFWEventLoop::Wake() { |
| ::glfwPostEmptyEvent(); |
| } |
| |
| } // namespace flutter |