Files
MapLibreParticleLab/src/mbgl/actor/scheduler.cpp
2024-09-23 20:23:11 +02:00

72 lines
1.8 KiB
C++

#include <mbgl/actor/scheduler.hpp>
#include <mbgl/util/thread_local.hpp>
#include <mbgl/util/thread_pool.hpp>
namespace mbgl {
std::function<void()> Scheduler::bindOnce(std::function<void()> 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));
};
}
namespace {
thread_local Scheduler* localScheduler;
} // namespace
void Scheduler::SetCurrent(Scheduler* scheduler) {
localScheduler = scheduler;
}
Scheduler* Scheduler::GetCurrent() {
return localScheduler;
}
// static
std::shared_ptr<Scheduler> Scheduler::GetBackground() {
static std::weak_ptr<Scheduler> weak;
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
std::shared_ptr<Scheduler> scheduler = weak.lock();
if (!scheduler) {
weak = scheduler = std::make_shared<ThreadPool>();
}
return scheduler;
}
// static
std::shared_ptr<Scheduler> Scheduler::GetSequenced() {
const std::size_t kSchedulersCount = 10;
static std::vector<std::weak_ptr<Scheduler>> weaks(kSchedulersCount);
static std::mutex mtx;
static std::size_t lastUsedIndex = 0u;
std::lock_guard<std::mutex> lock(mtx);
if (++lastUsedIndex == kSchedulersCount) lastUsedIndex = 0u;
std::shared_ptr<Scheduler> 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<SequencedScheduler>();
weak = result;
lastUsedIndex = i;
break;
}
return result;
}
} // namespace mbgl