diff --git a/engine/src/flutter/shell/platform/windows/task_runner.cc b/engine/src/flutter/shell/platform/windows/task_runner.cc index fc4b541abf801..266e7b6738c0b 100644 --- a/engine/src/flutter/shell/platform/windows/task_runner.cc +++ b/engine/src/flutter/shell/platform/windows/task_runner.cc @@ -63,10 +63,11 @@ std::chrono::nanoseconds TaskRunner::ProcessTasks() { // Calculate duration to sleep for on next iteration. { std::lock_guard lock(task_queue_mutex_); - const auto next_wake = task_queue_.empty() ? TaskTimePoint::max() - : task_queue_.top().fire_time; - - return std::min(next_wake - now, std::chrono::nanoseconds::max()); + if (task_queue_.empty()) { + return std::chrono::nanoseconds::max(); + } else { + return task_queue_.top().fire_time - now; + } } } diff --git a/engine/src/flutter/shell/platform/windows/task_runner_unittests.cc b/engine/src/flutter/shell/platform/windows/task_runner_unittests.cc index fce19ae35851b..d0b049d2bf4a4 100644 --- a/engine/src/flutter/shell/platform/windows/task_runner_unittests.cc +++ b/engine/src/flutter/shell/platform/windows/task_runner_unittests.cc @@ -121,6 +121,12 @@ class TestTaskRunnerWindow : public TaskRunnerWindow { TestTaskRunnerWindow() : TaskRunnerWindow() {} }; +TEST(TaskRunnerTest, EmptyTaskRunnerReturnsNanoSecondsMax) { + TaskRunner runner(MockGetCurrentTime, [](const FlutterTask*) {}); + auto res = runner.ProcessTasks(); + EXPECT_EQ(res, std::chrono::nanoseconds::max()); +} + TEST(TaskRunnerTest, TaskRunnerWindowCoalescesWakeUpMessages) { class Delegate : public TaskRunnerWindow::Delegate { public: diff --git a/engine/src/flutter/shell/platform/windows/task_runner_window.cc b/engine/src/flutter/shell/platform/windows/task_runner_window.cc index d094c3c36bb96..08b69a6d20f6a 100644 --- a/engine/src/flutter/shell/platform/windows/task_runner_window.cc +++ b/engine/src/flutter/shell/platform/windows/task_runner_window.cc @@ -185,12 +185,11 @@ void TaskRunnerWindow::ProcessTasks() { } void TaskRunnerWindow::SetTimer(std::chrono::nanoseconds when) { - if (when == std::chrono::nanoseconds::max()) { - timer_thread_.ScheduleAt( - std::chrono::time_point::max()); - } else { - timer_thread_.ScheduleAt(std::chrono::high_resolution_clock::now() + when); - } + auto now = std::chrono::high_resolution_clock::now(); + auto remaining_to_max = + std::chrono::nanoseconds::max() - now.time_since_epoch(); + when = std::min(when, remaining_to_max); + timer_thread_.ScheduleAt(now + when); } WNDCLASS TaskRunnerWindow::RegisterWindowClass() {