• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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