#include #include #include #include namespace mbgl { std::function Scheduler::bindOnce(std::function fn) { assert(fn); return [scheduler = makeWeakPtr(), scheduled = std::move(fn)]() mutable { if (!scheduled) return; // Repeated call. if (auto guard = scheduler.lock(); scheduler) { scheduler->schedule(std::move(scheduled)); } }; } namespace { thread_local Scheduler* localScheduler; } // namespace void Scheduler::SetCurrent(Scheduler* scheduler) { localScheduler = scheduler; } Scheduler* Scheduler::GetCurrent(bool init) { if (!localScheduler && init) { static thread_local util::RunLoop runLoop; SetCurrent(&runLoop); } return localScheduler; } // static std::shared_ptr Scheduler::GetBackground() { static std::weak_ptr weak; static std::mutex mtx; std::lock_guard lock(mtx); std::shared_ptr scheduler = weak.lock(); if (!scheduler) { weak = scheduler = std::make_shared(); } return scheduler; } // static std::shared_ptr Scheduler::GetSequenced() { constexpr std::size_t kSchedulersCount = 10; static std::vector> weaks(kSchedulersCount); static std::mutex mtx; static std::size_t lastUsedIndex = 0u; std::lock_guard lock(mtx); lastUsedIndex = (lastUsedIndex + 1) % kSchedulersCount; if (auto scheduler = weaks[lastUsedIndex].lock()) { return scheduler; } else { auto result = std::make_shared(); weaks[lastUsedIndex] = result; return result; } } } // namespace mbgl