1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #define FML_USED_ON_EMBEDDER
6
7 #include "flutter/fml/task_runner.h"
8
9 #include <utility>
10
11 #include "flutter/fml/logging.h"
12 #include "flutter/fml/message_loop.h"
13 #include "flutter/fml/message_loop_impl.h"
14 #include "flutter/fml/message_loop_task_queues.h"
15
16 namespace fml {
17
TaskRunner(fml::RefPtr<MessageLoopImpl> loop)18 TaskRunner::TaskRunner(fml::RefPtr<MessageLoopImpl> loop)
19 : loop_(std::move(loop)) {}
20
21 TaskRunner::~TaskRunner() = default;
22
PostTask(fml::closure task)23 void TaskRunner::PostTask(fml::closure task) {
24 loop_->PostTask(std::move(task), fml::TimePoint::Now());
25 }
26
PostTaskForTime(fml::closure task,fml::TimePoint target_time)27 void TaskRunner::PostTaskForTime(fml::closure task,
28 fml::TimePoint target_time) {
29 loop_->PostTask(std::move(task), target_time);
30 }
31
PostDelayedTask(fml::closure task,fml::TimeDelta delay)32 void TaskRunner::PostDelayedTask(fml::closure task, fml::TimeDelta delay) {
33 loop_->PostTask(std::move(task), fml::TimePoint::Now() + delay);
34 }
35
GetTaskQueueId()36 TaskQueueId TaskRunner::GetTaskQueueId() {
37 FML_DCHECK(loop_);
38 return loop_->GetTaskQueueId();
39 }
40
RunsTasksOnCurrentThread()41 bool TaskRunner::RunsTasksOnCurrentThread() {
42 if (!fml::MessageLoop::IsInitializedForCurrentThread()) {
43 return false;
44 }
45
46 const auto current_queue_id = MessageLoop::GetCurrentTaskQueueId();
47 const auto loop_queue_id = loop_->GetTaskQueueId();
48
49 if (current_queue_id == loop_queue_id) {
50 return true;
51 }
52
53 auto queues = MessageLoopTaskQueues::GetInstance();
54 if (queues->Owns(current_queue_id, loop_queue_id)) {
55 return true;
56 }
57 if (queues->Owns(loop_queue_id, current_queue_id)) {
58 return true;
59 }
60
61 return false;
62 }
63
RunNowOrPostTask(fml::RefPtr<fml::TaskRunner> runner,fml::closure task)64 void TaskRunner::RunNowOrPostTask(fml::RefPtr<fml::TaskRunner> runner,
65 fml::closure task) {
66 FML_DCHECK(runner);
67 if (runner->RunsTasksOnCurrentThread()) {
68 task();
69 } else {
70 runner->PostTask(std::move(task));
71 }
72 }
73
74 } // namespace fml
75