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.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp
index 81e259fe1f..d84bad9091 100644
--- a/src/mbgl/actor/scheduler.cpp
+++ b/src/mbgl/actor/scheduler.cpp
@@ -4,13 +4,30 @@
namespace mbgl {
-std::function<void()> Scheduler::bindOnce(std::function<void()> fn) {
- assert(fn);
- return [scheduler = makeWeakPtr(), scheduled = std::move(fn)]() mutable {
+namespace {
+
+class BindContext {
+public:
+ BindContext(std::function<void()> scheduled_, mapbox::base::WeakPtr<Scheduler> scheduler_)
+ : scheduled(std::move(scheduled_)), scheduler(std::move(scheduler_)) {}
+
+ std::function<void()> scheduled;
+ mapbox::base::WeakPtr<Scheduler> scheduler;
+
+ void scheduleOnce() {
if (!scheduled) return; // Repeated call.
auto schedulerGuard = scheduler.lock();
if (scheduler) scheduler->schedule(std::move(scheduled));
- };
+ assert(!scheduled);
+ }
+};
+
+} // namespace
+
+std::function<void()> Scheduler::bindOnce(std::function<void()> fn) {
+ assert(fn);
+ auto ctx = new BindContext(std::move(fn), makeWeakPtr());
+ return [ctx]() { ctx->scheduleOnce(); };
}
static auto& current() {