14 : get_current_time_(get_current_time),
15 on_task_expired_(std::move(on_task_expired)) {
16 main_thread_id_ = GetCurrentThreadId();
18 task_runner_window_->AddDelegate(
this);
22 task_runner_window_->RemoveDelegate(
this);
28 std::vector<Task> expired_tasks;
32 std::lock_guard<std::mutex> lock(task_queue_mutex_);
33 while (!task_queue_.empty()) {
34 const auto& top = task_queue_.top();
37 if (top.fire_time > now) {
45 expired_tasks.push_back(task_queue_.top());
55 for (
const auto& task : expired_tasks) {
56 if (
auto flutter_task = std::get_if<FlutterTask>(&task.variant)) {
57 on_task_expired_(flutter_task);
58 }
else if (
auto closure = std::get_if<TaskClosure>(&task.variant))
65 std::lock_guard<std::mutex> lock(task_queue_mutex_);
66 if (task_queue_.empty()) {
67 return std::chrono::nanoseconds::max();
69 return task_queue_.top().fire_time - now;
75 uint64_t flutter_target_time_nanos)
const {
76 const auto now = GetCurrentTimeForTask();
77 const auto flutter_duration = flutter_target_time_nanos - get_current_time_();
78 return now + std::chrono::nanoseconds(flutter_duration);
82 uint64_t flutter_target_time_nanos) {
84 task.fire_time = TimePointFromFlutterTime(flutter_target_time_nanos);
85 task.variant = flutter_task;
86 EnqueueTask(std::move(task));
91 task.fire_time = GetCurrentTimeForTask();
92 task.variant = std::move(closure);
93 EnqueueTask(std::move(task));
97 task_runner_window_->PollOnce(timeout);
100 void TaskRunner::EnqueueTask(Task task) {
101 static std::atomic_uint64_t sGlobalTaskOrder(0);
103 task.order = ++sGlobalTaskOrder;
105 std::lock_guard<std::mutex> lock(task_queue_mutex_);
106 task_queue_.push(task);
118 return GetCurrentThreadId() == main_thread_id_;
121 void TaskRunner::WakeUp() {
122 task_runner_window_->WakeUp();
std::chrono::steady_clock::time_point TaskTimePoint
void PostFlutterTask(FlutterTask flutter_task, uint64_t flutter_target_time_nanos)
TaskRunner(CurrentTimeProc get_current_time, const TaskExpiredCallback &on_task_expired)
virtual bool RunsTasksOnCurrentThread() const
std::function< void(const FlutterTask *)> TaskExpiredCallback
void PollOnce(std::chrono::milliseconds timeout)
std::function< void()> TaskClosure
void PostTask(TaskClosure task)
std::chrono::nanoseconds ProcessTasks()
static std::shared_ptr< TaskRunnerWindow > GetSharedInstance()
uint64_t(* CurrentTimeProc)()