summaryrefslogtreecommitdiff
path: root/src/mbgl/actor/scheduler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/actor/scheduler.cpp')
-rw-r--r--src/mbgl/actor/scheduler.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp
index 81e259fe1f..0e051d0273 100644
--- a/src/mbgl/actor/scheduler.cpp
+++ b/src/mbgl/actor/scheduler.cpp
@@ -41,4 +41,31 @@ std::shared_ptr<Scheduler> Scheduler::GetBackground() {
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