summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-11 17:25:35 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-11 17:25:35 +0100
commit20c7aa703bf0be2744f1578d4e6c2044c15a51c0 (patch)
tree23b9753ae7c35f5be86a032a7c2e0bbe15a15f42
parent928d989aef13e72064f31e3d6cad64f46c56bfdc (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).
-rw-r--r--src/core/managed/Managed.hpp2
-rw-r--r--src/core/managed/Manager.cpp26
-rw-r--r--src/core/managed/Manager.hpp8
3 files changed, 34 insertions, 2 deletions
diff --git a/src/core/managed/Managed.hpp b/src/core/managed/Managed.hpp
index 4784e46..26118dc 100644
--- a/src/core/managed/Managed.hpp
+++ b/src/core/managed/Managed.hpp
@@ -82,7 +82,7 @@ public:
/**
* Virtual destuctor which may be overwritten by child classes.
*/
- virtual ~Managed(){};
+ virtual ~Managed() { mgr.unmanage(this); };
/**
* Returns a reference ot the manager instance which owns this managed
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());
diff --git a/src/core/managed/Manager.hpp b/src/core/managed/Manager.hpp
index 6275df1..47d1fc7 100644
--- a/src/core/managed/Manager.hpp
+++ b/src/core/managed/Manager.hpp
@@ -273,6 +273,14 @@ public:
void manage(Managed *o);
/**
+ * Removes a previously managed object from the manager -- this function is
+ * called from the destructor of the Managed class.
+ *
+ * @param o is the object that should be unregistered from the manager.
+ */
+ void unmanage(Managed *o);
+
+ /**
* Stores a reference to the given target object from the given source
* object. If the source pointer is set to nullptr, this means that the
* target object is rooted (semantic: it is reachable from the current