From kde-commits Sun Jan 31 22:54:03 2010 From: Cyrille Berger Date: Sun, 31 Jan 2010 22:54:03 +0000 To: kde-commits Subject: koffice/krita/image Message-Id: <1264978443.391071.32522.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=126497845209464 SVN commit 1083273 by berger: remove qobject function, add function to dump the current state of the tracker M +43 -6 kis_memory_leak_tracker.cpp M +2 -2 kis_memory_leak_tracker.h --- trunk/koffice/krita/image/kis_memory_leak_tracker.cpp #1083272:1083273 @@ -73,11 +73,11 @@ QHash whatWhoWhen; QHash whatQObjWhoWhen; template - void dumpReferencedObjectsAndDelete(QHash&); + void dumpReferencedObjectsAndDelete(QHash&, bool _delete); }; template -void KisMemoryLeakTracker::Private::dumpReferencedObjectsAndDelete(QHash& map) +void KisMemoryLeakTracker::Private::dumpReferencedObjectsAndDelete(QHash& map, bool _delete) { for (typename QHash::iterator it = map.begin(); it != map.end(); ++it) { @@ -90,8 +90,10 @@ for (int i = 0; i < info->size; ++i) { errKrita << strings[i]; } - delete info; - it2.value() = 0; + if (_delete) { + delete info; + it2.value() = 0; + } } errKrita << "====="; } @@ -108,8 +110,8 @@ } else { errKrita << "****************************************"; errKrita << (d->whatQObjWhoWhen.size() + d->whatWhoWhen.size()) << " leaks have been detected"; - d->dumpReferencedObjectsAndDelete(d->whatWhoWhen); - d->dumpReferencedObjectsAndDelete(d->whatQObjWhoWhen); + d->dumpReferencedObjectsAndDelete(d->whatWhoWhen, true); + d->dumpReferencedObjectsAndDelete(d->whatQObjWhoWhen, true); errKrita << "****************************************"; } delete d; @@ -154,6 +156,33 @@ d->whatQObjWhoWhen.remove(what); } } + +void KisMemoryLeakTracker::dumpReferences() +{ + errKrita << "****************************************"; + errKrita << (d->whatQObjWhoWhen.size() + d->whatWhoWhen.size()) << " objects are currently referenced"; + d->dumpReferencedObjectsAndDelete(d->whatWhoWhen, false); + d->dumpReferencedObjectsAndDelete(d->whatQObjWhoWhen, false); + errKrita << "****************************************"; +} + +void KisMemoryLeakTracker::dumpReferences(const void* what) +{ + if (!d->whatWhoWhen.contains(what)) return; + WhatInfo& info = d->whatWhoWhen[what]; + errKrita << "Object " << what << "(" << info.name << ") is still referenced by " << info.infos.size() << " objects:"; + for (QHash::iterator it2 = info.infos.begin(); + it2 != info.infos.end(); ++it2) { + BacktraceInfo* info = it2.value(); + char** strings = backtrace_symbols(info->trace, info->size); + errKrita << "Referenced by " << it2.key() << " at:"; + for (int i = 0; i < info->size; ++i) { + errKrita << strings[i]; + } + } + errKrita << "====="; +} + #else #error "Hum, no memory leak tracker for your platform" #endif @@ -184,4 +213,12 @@ { } +void KisMemoryLeakTracker::dumpReferences() +{ +} + +void KisMemoryLeakTracker::dumpReferences(const void* what) +{ +} + #endif --- trunk/koffice/krita/image/kis_memory_leak_tracker.h #1083272:1083273 @@ -40,8 +40,8 @@ static KisMemoryLeakTracker* instance(); void reference(const void* what, const void* bywho, const char* whatName = 0); void dereference(const void* what, const void* bywho); - void reference(const QObject* what, const void* bywho); - void dereference(const QObject* what, const void* bywho); + void dumpReferences(); + void dumpReferences(const void* what); public: template void reference(const _T_* what, const void* bywho);