#include #include #include #include namespace mbgl { namespace util { class RunLoop::Impl { public: std::unique_ptr async; }; RunLoop* RunLoop::Get() { assert(static_cast(Scheduler::GetCurrent())); return static_cast(Scheduler::GetCurrent()); } RunLoop::RunLoop(Type) : impl(std::make_unique()) { assert(!Scheduler::GetCurrent()); Scheduler::SetCurrent(this); impl->async = std::make_unique(std::bind(&RunLoop::process, this)); } RunLoop::~RunLoop() { assert(Scheduler::GetCurrent()); Scheduler::SetCurrent(nullptr); } void RunLoop::push(std::shared_ptr task) { withMutex([&] { queue.push(std::move(task)); }); impl->async->send(); } void RunLoop::run() { CFRunLoopRun(); } void RunLoop::runOnce() { CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); } void RunLoop::stop() { invoke([&] { CFRunLoopStop(CFRunLoopGetCurrent()); }); } } // namespace util } // namespace mbgl