From 20c7aa703bf0be2744f1578d4e6c2044c15a51c0 Mon Sep 17 00:00:00 2001 From: Benjamin Paassen Date: Wed, 11 Feb 2015 17:25:35 +0100 Subject: 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). --- src/core/managed/Manager.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/core/managed/Manager.cpp') 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()); -- cgit v1.2.3 From 5659292bf1a317235a51a946df640376f325b124 Mon Sep 17 00:00:00 2001 From: Benjamin Paassen Date: Wed, 11 Feb 2015 17:26:26 +0100 Subject: manager formatting stuff. --- src/core/managed/Manager.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/core/managed/Manager.cpp') diff --git a/src/core/managed/Manager.cpp b/src/core/managed/Manager.cpp index 859e5ec..694587f 100644 --- a/src/core/managed/Manager.cpp +++ b/src/core/managed/Manager.cpp @@ -123,6 +123,12 @@ Manager::~Manager() // Perform a final sweep sweep(); +#ifdef MANAGER_GRAPHVIZ_EXPORT + if (!objects.empty()) { + exportGraphviz("manager_crashdump.dot"); + } +#endif + // All objects should have been deleted! assert(objects.empty()); @@ -220,10 +226,11 @@ void Manager::deleteRef(Managed *tar, Managed *src, bool all) #ifdef MANAGER_DEBUG_HIDDEN_ROOTED if (deletionRecursionDepth > 0 && src == 0) { - std::cerr << "\x1b[41;30mManager:\x1b[0m A managed object contains a rooted reference, " + std::cerr << "\x1b[41;30mManager:\x1b[0m A managed object contains a " + "rooted reference, " "this may cause memory leaks!" << std::endl; - std::cerr << "\x1b[41;30mManager:\x1b[0m Referenced object is " << tar << " of type " - << tar->type()->name << std::endl; + std::cerr << "\x1b[41;30mManager:\x1b[0m Referenced object is " << tar + << " of type " << tar->type()->name << std::endl; } #endif @@ -635,7 +642,8 @@ void Manager::exportGraphviz(const char *filename) // Print the label fs << "\t\tlabel=<" << "" - << "" + << "" << ""; // Print any name -- cgit v1.2.3
" << std::hex << std::showbase << p << "
" << std::hex << std::showbase << p << " (" + << getUid(objectPtr) << ")
" << typeName << "