| // 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/fml/platform/win/message_loop_win.h" |
| |
| #include "flutter/fml/logging.h" |
| |
| namespace fml { |
| |
| MessageLoopWin::MessageLoopWin() |
| : timer_(CreateWaitableTimer(NULL, FALSE, NULL)) { |
| FML_CHECK(timer_.is_valid()); |
| } |
| |
| MessageLoopWin::~MessageLoopWin() = default; |
| |
| void MessageLoopWin::Run() { |
| running_ = true; |
| |
| while (running_) { |
| FML_CHECK(WaitForSingleObject(timer_.get(), INFINITE) == 0); |
| RunExpiredTasksNow(); |
| } |
| } |
| |
| void MessageLoopWin::Terminate() { |
| running_ = false; |
| WakeUp(fml::TimePoint::Now()); |
| } |
| |
| void MessageLoopWin::WakeUp(fml::TimePoint time_point) { |
| LARGE_INTEGER due_time = {0}; |
| fml::TimePoint now = fml::TimePoint::Now(); |
| if (time_point > now) { |
| due_time.QuadPart = (time_point - now).ToNanoseconds() / -100; |
| } |
| FML_CHECK(SetWaitableTimer(timer_.get(), &due_time, 0, NULL, NULL, FALSE)); |
| } |
| |
| } // namespace fml |