#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. auto schedulerGuard = scheduler.lock(); if (scheduler) scheduler->schedule(std::move(scheduled)); }; } static auto& current() { static util::ThreadLocal scheduler; return scheduler; }; void Scheduler::SetCurrent(Scheduler* scheduler) { current().set(scheduler); } Scheduler* Scheduler::GetCurrent() { return current().get(); } // static PassRefPtr 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 PassRefPtr(std::move(scheduler)); } // static PassRefPtr Scheduler::GetSequenced() { const 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); if (++lastUsedIndex == kSchedulersCount) lastUsedIndex = 0u; std::shared_ptr result; for (std::size_t i = 0; i < kSchedulersCount; ++i) { auto& weak = weaks[i]; if (auto scheduler = weak.lock()) { if (lastUsedIndex == i) result = scheduler; continue; } result = std::make_shared(); weak = result; lastUsedIndex = i; break; } return PassRefPtr(std::move(result)); } } //namespace mbgl