diff --git a/include/mbgl/map/backend_scope.hpp b/include/mbgl/map/backend_scope.hpp index c13fb88de..5a207e6ac 100644 --- a/include/mbgl/map/backend_scope.hpp +++ b/include/mbgl/map/backend_scope.hpp @@ -10,7 +10,8 @@ public: ~BackendScope(); private: - Backend* priorBackend; + BackendScope* priorScope; + BackendScope* nextScope; Backend& backend; }; diff --git a/src/mbgl/map/backend_scope.cpp b/src/mbgl/map/backend_scope.cpp index 302dfd70c..98775cead 100644 --- a/src/mbgl/map/backend_scope.cpp +++ b/src/mbgl/map/backend_scope.cpp @@ -2,24 +2,34 @@ #include #include +#include + namespace mbgl { -static util::ThreadLocal currentBackend; +static util::ThreadLocal currentScope; BackendScope::BackendScope(Backend& backend_) - : priorBackend(currentBackend.get()), + : priorScope(currentScope.get()), + nextScope(nullptr), backend(backend_) { + if (priorScope) { + assert(priorScope->nextScope == nullptr); + priorScope->nextScope = this; + } backend.activate(); - currentBackend.set(&backend); + currentScope.set(this); } BackendScope::~BackendScope() { - if (priorBackend) { - priorBackend->activate(); - currentBackend.set(priorBackend); + assert(nextScope == nullptr); + if (priorScope) { + priorScope->backend.activate(); + currentScope.set(priorScope); + assert(priorScope->nextScope == this); + priorScope->nextScope = nullptr; } else { backend.deactivate(); - currentBackend.set(nullptr); + currentScope.set(nullptr); } }