| // 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_IMPL_H_ | |
| #define FLUTTER_FML_MESSAGE_LOOP_IMPL_H_ | |
| #include <atomic> | |
| #include <deque> | |
| #include <map> | |
| #include <mutex> | |
| #include <queue> | |
| #include <utility> | |
| #include "flutter/fml/closure.h" | |
| #include "flutter/fml/delayed_task.h" | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/fml/memory/ref_counted.h" | |
| #include "flutter/fml/message_loop.h" | |
| #include "flutter/fml/message_loop_task_queues.h" | |
| #include "flutter/fml/time/time_point.h" | |
| #include "flutter/fml/wakeable.h" | |
| namespace fml { | |
| class MessageLoopImpl : public Wakeable, | |
| public fml::RefCountedThreadSafe<MessageLoopImpl> { | |
| public: | |
| static fml::RefPtr<MessageLoopImpl> Create(); | |
| virtual ~MessageLoopImpl(); | |
| virtual void Run() = 0; | |
| virtual void Terminate() = 0; | |
| void PostTask(const fml::closure& task, fml::TimePoint target_time); | |
| void AddTaskObserver(intptr_t key, const fml::closure& callback); | |
| void RemoveTaskObserver(intptr_t key); | |
| void DoRun(); | |
| void DoTerminate(); | |
| virtual TaskQueueId GetTaskQueueId() const; | |
| protected: | |
| // Exposed for the embedder shell which allows clients to poll for events | |
| // instead of dedicating a thread to the message loop. | |
| friend class MessageLoop; | |
| void RunExpiredTasksNow(); | |
| void RunSingleExpiredTaskNow(); | |
| protected: | |
| MessageLoopImpl(); | |
| private: | |
| fml::RefPtr<MessageLoopTaskQueues> task_queue_; | |
| TaskQueueId queue_id_; | |
| std::atomic_bool terminated_; | |
| void FlushTasks(FlushType type); | |
| FML_DISALLOW_COPY_AND_ASSIGN(MessageLoopImpl); | |
| }; | |
| } // namespace fml | |
| #endif // FLUTTER_FML_MESSAGE_LOOP_IMPL_H_ |