diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-11 17:25:35 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-11 17:25:35 +0100 |
commit | 20c7aa703bf0be2744f1578d4e6c2044c15a51c0 (patch) | |
tree | 23b9753ae7c35f5be86a032a7c2e0bbe15a15f42 /src/core/managed/Manager.cpp | |
parent | 928d989aef13e72064f31e3d6cad64f46c56bfdc (diff) |
Added "unmanage" function which removes managed objects from the Manager in the case their destructor is called (e.g. because an exception is called in the constructor).
Diffstat (limited to 'src/core/managed/Manager.cpp')
-rw-r--r-- | src/core/managed/Manager.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/managed/Manager.cpp b/src/core/managed/Manager.cpp index ee4da5f..859e5ec 100644 --- a/src/core/managed/Manager.cpp +++ b/src/core/managed/Manager.cpp @@ -159,6 +159,30 @@ void Manager::manage(Managed *o) nextUid++; } +void Manager::unmanage(Managed *o) +{ + if (!deleted.count(o)) { + Manager::ObjectDescriptor *descr = getDescriptor(o); + if (descr != nullptr) { + // Make sure all input references are deleted + while (!descr->refIn.empty()) { + deleteRef(o, descr->refIn.begin()->first, true); + } + // Remove all output references of this Managed + while (!descr->refOut.empty()) { + deleteRef(descr->refOut.begin()->first, o, true); + } + + // Remove the uid, data and event store entry + uids.erase(descr->uid); + store.erase(o); + events.erase(o); + marked.erase(o); + objects.erase(o); + } + } +} + void Manager::addRef(Managed *tar, Managed *src) { #ifdef MANAGER_DEBUG_PRINT @@ -286,10 +310,10 @@ void Manager::purgeDeleted() for (size_t i = 0; i < orderedDeleted.size(); i++) { Managed *m = orderedDeleted[i]; + delete m; deleted.erase(m); marked.erase(m); objects.erase(m); - delete m; } orderedDeleted.clear(); assert(deleted.empty()); |