// 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. #ifndef FLUTTER_FML_TASK_RUNNER_H_ #define FLUTTER_FML_TASK_RUNNER_H_ #include "flutter/fml/closure.h" #include "flutter/fml/macros.h" #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" #include "flutter/fml/message_loop_task_queues.h" #include "flutter/fml/time/time_point.h" namespace fml { class MessageLoopImpl; /// An interface over the ability to schedule tasks on a \p TaskRunner. class BasicTaskRunner { public: /// Schedules \p task to be executed on the TaskRunner's associated event /// loop. virtual void PostTask(const fml::closure& task) = 0; }; /// The object for scheduling tasks on a \p fml::MessageLoop. /// /// Typically there is one \p TaskRunner associated with each thread. When one /// wants to execute an operation on that thread they post a task to the /// TaskRunner. /// /// \see fml::MessageLoop class TaskRunner : public fml::RefCountedThreadSafe, public BasicTaskRunner { public: virtual ~TaskRunner(); virtual void PostTask(const fml::closure& task) override; virtual void PostTaskForTime(const fml::closure& task, fml::TimePoint target_time); /// Schedules a task to be run on the MessageLoop after the time \p delay has /// passed. /// \note There is latency between when the task is schedule and actually /// executed so that the actual execution time is: now + delay + /// message_loop_latency, where message_loop_latency is undefined and could be /// tens of milliseconds. virtual void PostDelayedTask(const fml::closure& task, fml::TimeDelta delay); /// Returns \p true when the current executing thread's TaskRunner matches /// this instance. virtual bool RunsTasksOnCurrentThread(); /// Returns the unique identifier associated with the TaskRunner. /// \see fml::MessageLoopTaskQueues virtual TaskQueueId GetTaskQueueId(); /// Executes the \p task directly if the TaskRunner \p runner is the /// TaskRunner associated with the current executing thread. static void RunNowOrPostTask(const fml::RefPtr& runner, const fml::closure& task); protected: explicit TaskRunner(fml::RefPtr loop); private: fml::RefPtr loop_; FML_FRIEND_MAKE_REF_COUNTED(TaskRunner); FML_FRIEND_REF_COUNTED_THREAD_SAFE(TaskRunner); FML_DISALLOW_COPY_AND_ASSIGN(TaskRunner); }; } // namespace fml #endif // FLUTTER_FML_TASK_RUNNER_H_