diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/managed/Manager.cpp | 27 | ||||
| -rw-r--r-- | src/core/managed/Manager.hpp | 51 | 
2 files changed, 75 insertions, 3 deletions
diff --git a/src/core/managed/Manager.cpp b/src/core/managed/Manager.cpp index 823dc88..d92bbb5 100644 --- a/src/core/managed/Manager.cpp +++ b/src/core/managed/Manager.cpp @@ -154,7 +154,9 @@ void Manager::manage(Managed *o)  #ifdef MANAGER_DEBUG_PRINT  	std::cout << "manage " << o << std::endl;  #endif -	objects.emplace(std::make_pair(o, ObjectDescriptor{})); +	objects.emplace(o, ObjectDescriptor{nextUid}); +	uids.emplace(nextUid, o); +	nextUid++;  }  void Manager::addRef(Managed *tar, Managed *src) @@ -257,7 +259,8 @@ void Manager::deleteObject(Managed *o, ObjectDescriptor *descr)  			deleteRef(descr->refOut.begin()->first, o, true);  		} -		// Remove the data store and the event store entry +		// Remove the uid, data and event store entry +		uids.erase(descr->uid);  		store.erase(o);  		events.erase(o); @@ -370,6 +373,26 @@ void Manager::sweep()  	}  } +/* Class Managed: Unique IDs */ + +ManagedUid Manager::getUid(Managed *o) +{ +	const auto it = objects.find(o); +	if (it != objects.end()) { +		return it->second.uid; +	} +	return 0; +} + +Managed *Manager::getManaged(ManagedUid uid) +{ +	const auto it = uids.find(uid); +	if (it != uids.end()) { +		return it->second; +	} +	return nullptr; +} +  /* Class Manager: Attached data */  void Manager::storeData(Managed *ref, const std::string &key, Managed *data) diff --git a/src/core/managed/Manager.hpp b/src/core/managed/Manager.hpp index 8ee11c4..eb4594a 100644 --- a/src/core/managed/Manager.hpp +++ b/src/core/managed/Manager.hpp @@ -47,6 +47,8 @@ namespace ousia {  // Forward declaration  class Managed; +using ManagedUid = uint64_t; +  /**   * The Manager class implements tracing garbage collection. Garbage Collection   * is implemented as a simple directed reference graph with connected component @@ -71,6 +73,12 @@ public:  	struct ObjectDescriptor {  	public:  		/** +		 * Unique ID assigned to the object. Valid unique ids are positive, +		 * non-zero values. +		 */ +		const ManagedUid uid; + +		/**  		 * Contains the number of references to rooted handles. A managed  		 * objects  		 * whith at least one rooted reference is considered reachable. @@ -94,7 +102,14 @@ public:  		/**  		 * Default constructor of the ObjectDescriptor class.  		 */ -		ObjectDescriptor() : rootRefCount(0){}; +		ObjectDescriptor() : uid(0), rootRefCount(0) {}; + +		/** +		 * Creates a new ObjectDescriptor with the given unique id. +		 * +		 * @param uid is the unique id to be stored. +		 */ +		ObjectDescriptor(ManagedUid uid) : uid(uid), rootRefCount(0) {};  		/**  		 * Returns true, if the ObjectDescriptor has at least one input @@ -147,12 +162,23 @@ private:  	const size_t threshold;  	/** +	 * Next UID being assigned to the next object for which the "manage" +	 * function is called. +	 */ +	ManagedUid nextUid = 1; + +	/**  	 * Map used to store the descriptors for all managed objects. Every object  	 * that has at least one root, in or out reference has an entry in this map.  	 */  	std::unordered_map<Managed *, ObjectDescriptor> objects;  	/** +	 * Map from Uids to Managed pointers. +	 */ +	std::unordered_map<ManagedUid, Managed *> uids; + +	/**  	 * Set containing the objects marked for sweeping.  	 */  	std::unordered_set<Managed *> marked; @@ -275,6 +301,29 @@ public:  	 */  	void sweep(); +	/* Unique IDs */ + +	/** +	 * Returns the unique identifier (UID) of the given object. Valid UIDs are +	 * positive non-zero values. A value of zero indicates that the given object +	 * does no longer exists or was not registered in the manager instance. +	 * +	 * @param o is a pointer to the managed object for which the UID should be +	 * returned. +	 * @return the unique id of the object or zero if the object does not exist. +	 */ +	ManagedUid getUid(Managed *o); + +	/** +	 * Returns a pointer to the given managed object or nullptr if the object +	 * no longer exists. This behaviour can be used to implement weak +	 * references. +	 * +	 * @param uid is the unique id for which the object should be returned. +	 * @return a pointer to the object with the given uid. +	 */ +	Managed * getManaged(ManagedUid uid); +  	/* Data storage */  	/**  | 
