diff --git a/direct/src/showbase/DirectObject.py b/direct/src/showbase/DirectObject.py index 35a8a84203..c445099c7e 100644 --- a/direct/src/showbase/DirectObject.py +++ b/direct/src/showbase/DirectObject.py @@ -3,6 +3,7 @@ __all__ = ['DirectObject'] +from direct.directnotify.DirectNotifyGlobal import directNotify from MessengerGlobal import messenger from direct.showbase.PythonUtil import ClassTree @@ -81,3 +82,22 @@ class DirectObject: def _clearTask(self, task): del self._taskList[task.id] + def detectLeaks(self): + # call this after the DirectObject instance has been destroyed + # if it's leaking, will notify user + + # make sure we're not still listening for messenger events + events = messenger.getAllAccepting(self) + # make sure we're not leaking tasks + # TODO: include tasks that were added directly to the taskMgr + tasks = [] + if hasattr(self, '_taskList'): + tasks = [task.name for task in self._taskList.values()] + if len(events) or len(tasks): + estr = choice(len(events), 'listening to events: %s' % events, '') + andStr = choice(len(events) and len(tasks), ' and ', '') + tstr = choice(len(tasks), '%srunning tasks: %s' % (andStr, tasks), '') + notify = directNotify.newCategory('LeakDetect') + func = choice(getRepository()._crashOnProactiveLeakDetect, + self.notify.error, self.notify.warning) + func('destroyed %s instance is still %s%s' % (self.__class__.__name__, estr, tstr))