diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/managed/Managed.hpp | 2 | ||||
| -rw-r--r-- | src/core/managed/Manager.cpp | 26 | ||||
| -rw-r--r-- | src/core/managed/Manager.hpp | 8 | 
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  | 
