From b67126be16f82f425f50a6f30b1f0dea2343bc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Fri, 25 Dec 2015 13:30:00 +0200 Subject: [PATCH] Fixed|libdoomsday: Avoid a crash when reseting engine state Map observes when its manifest is deleted. IssueID #2144 --- doomsday/apps/libdoomsday/src/world/map.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/doomsday/apps/libdoomsday/src/world/map.cpp b/doomsday/apps/libdoomsday/src/world/map.cpp index 40974ca8e8..8c1e9dc2f2 100644 --- a/doomsday/apps/libdoomsday/src/world/map.cpp +++ b/doomsday/apps/libdoomsday/src/world/map.cpp @@ -1,6 +1,6 @@ /** @file world.cpp Base for world maps. * - * @authors Copyright © 2014-2015 Daniel Swanson + * @authors Copyright � 2014-2015 Daniel Swanson * * @par License * GPL: http://www.gnu.org/licenses/gpl.html @@ -24,6 +24,7 @@ using namespace de; namespace world { DENG2_PIMPL(Map) +, DENG2_OBSERVES(Record, Deletion) { res::MapManifest *manifest = nullptr; ///< Not owned, may be @c nullptr. @@ -34,6 +35,15 @@ DENG2_PIMPL(Map) { DENG2_FOR_PUBLIC_AUDIENCE2(Deletion, i) i->mapBeingDeleted(self); } + + void recordBeingDeleted(Record &record) + { + // The manifest is not owned by us, it may be deleted by others. + if(manifest == &record) + { + manifest = nullptr; + } + } DENG2_PIMPL_AUDIENCE(Deletion) }; @@ -66,7 +76,11 @@ res::MapManifest &Map::manifest() const void Map::setManifest(res::MapManifest *newManifest) { + if(d->manifest) d->manifest->audienceForDeletion() -= d; + d->manifest = newManifest; + + if(d->manifest) d->manifest->audienceForDeletion() += d; } } // namespace world