// 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_MESSAGE_LOOP_H_ #define FLUTTER_FML_MESSAGE_LOOP_H_ #include "flutter/fml/macros.h" #include "flutter/fml/task_runner.h" namespace fml { class TaskRunner; class MessageLoopImpl; /// An event loop associated with a thread. /// /// This class is the generic front-end to the MessageLoop, differences in /// implementation based on the running platform are in the subclasses of /// flutter::MessageLoopImpl (ex flutter::MessageLoopAndroid). /// /// For scheduling events on the message loop see flutter::TaskRunner. /// /// \see fml::TaskRunner /// \see fml::MessageLoopImpl /// \see fml::MessageLoopTaskQueues /// \see fml::Wakeable class MessageLoop { public: FML_EMBEDDER_ONLY static MessageLoop& GetCurrent(); void Run(); void Terminate(); void AddTaskObserver(intptr_t key, const fml::closure& callback); void RemoveTaskObserver(intptr_t key); fml::RefPtr GetTaskRunner() const; // Exposed for the embedder shell which allows clients to poll for events // instead of dedicating a thread to the message loop. void RunExpiredTasksNow(); static void EnsureInitializedForCurrentThread(); /// Returns true if \p EnsureInitializedForCurrentThread has been called on /// this thread already. static bool IsInitializedForCurrentThread(); ~MessageLoop(); /// Gets the unique identifier for the TaskQueue associated with the current /// thread. /// \see fml::MessageLoopTaskQueues static TaskQueueId GetCurrentTaskQueueId(); private: friend class TaskRunner; friend class MessageLoopImpl; fml::RefPtr loop_; fml::RefPtr task_runner_; MessageLoop(); fml::RefPtr GetLoopImpl() const; FML_DISALLOW_COPY_AND_ASSIGN(MessageLoop); }; } // namespace fml #endif // FLUTTER_FML_MESSAGE_LOOP_H_