| // 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/windows/task_runner_winuwp.h" | |
| #include <atomic> | |
| #include <utility> | |
| namespace flutter { | |
| // static | |
| std::unique_ptr<TaskRunner> TaskRunner::Create( | |
| DWORD main_thread_id, | |
| CurrentTimeProc get_current_time, | |
| const TaskExpiredCallback& on_task_expired) { | |
| return std::make_unique<TaskRunnerWinUwp>(main_thread_id, on_task_expired); | |
| } | |
| TaskRunnerWinUwp::TaskRunnerWinUwp(DWORD main_thread_id, | |
| const TaskExpiredCallback& on_task_expired) | |
| : main_thread_id_(main_thread_id), | |
| on_task_expired_(std::move(on_task_expired)) { | |
| dispatcher_ = | |
| winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread().Dispatcher(); | |
| } | |
| TaskRunnerWinUwp::~TaskRunnerWinUwp() = default; | |
| bool TaskRunnerWinUwp::RunsTasksOnCurrentThread() const { | |
| return GetCurrentThreadId() == main_thread_id_; | |
| } | |
| void TaskRunnerWinUwp::PostFlutterTask(FlutterTask flutter_task, | |
| uint64_t flutter_target_time_nanos) { | |
| // TODO: Handle the target time. See | |
| // https://github.com/flutter/flutter/issues/70890. | |
| dispatcher_.RunAsync( | |
| winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, | |
| [this, flutter_task]() { on_task_expired_(&flutter_task); }); | |
| } | |
| void TaskRunnerWinUwp::PostTask(TaskClosure task) { | |
| // TODO: Handle the target time. See PostFlutterTask() | |
| dispatcher_.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, | |
| [task]() { task(); }); | |
| } | |
| } // namespace flutter |