From dd353a60d1656f13351e8caa69e902b7f3111a02 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 4 May 2017 15:40:17 -0700 Subject: [PATCH] [core] Reset observers of removed Sources and Layers This ensures that the observer is not an invalid reference if the removed Source/Layer is retained, but the Style is deallocated. --- src/mbgl/style/layer_impl.cpp | 2 +- src/mbgl/style/source_impl.cpp | 2 +- src/mbgl/style/style.cpp | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mbgl/style/layer_impl.cpp b/src/mbgl/style/layer_impl.cpp index 44b1a8dd6..b8eb01fe7 100644 --- a/src/mbgl/style/layer_impl.cpp +++ b/src/mbgl/style/layer_impl.cpp @@ -12,7 +12,7 @@ std::unique_ptr Layer::Impl::copy(const std::string& id_, } void Layer::Impl::setObserver(LayerObserver* observer_) { - observer = observer_; + observer = observer_ ? observer_ : &nullObserver; } } // namespace style diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp index 8fdbd038d..1e9405abb 100644 --- a/src/mbgl/style/source_impl.cpp +++ b/src/mbgl/style/source_impl.cpp @@ -20,7 +20,7 @@ void Source::Impl::dumpDebugLogs() const { } void Source::Impl::setObserver(SourceObserver* observer_) { - observer = observer_; + observer = observer_ ? observer_ : &nullObserver; } } // namespace style diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index d2821751b..63fb60261 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -192,6 +192,7 @@ std::unique_ptr Style::removeSource(const std::string& id) { }); auto source = std::move(*it); + source->baseImpl->setObserver(nullptr); sources.erase(it); updateBatch.sourceIDs.erase(id); @@ -264,6 +265,7 @@ std::unique_ptr Style::removeLayer(const std::string& id) { customLayer->impl->deinitialize(); } + layer->baseImpl->setObserver(nullptr); layers.erase(it); removeRenderLayer(id); return layer;