Browse Source

additional leak debugging

Darren Ranalli 17 years ago
parent
commit
8d80413d03
1 changed files with 65 additions and 0 deletions
  1. 65 0
      direct/src/showbase/ContainerLeakDetector.py

+ 65 - 0
direct/src/showbase/ContainerLeakDetector.py

@@ -279,6 +279,12 @@ class ObjectRef:
             indirection.release()
         yield str
 
+    def getFinalIndirectionStr(self):
+        prevIndirection = None
+        if len(self._indirections) > 1:
+            prevIndirection = self._indirections[-2]
+        return self._indirections[-1].getString(prevIndirection=prevIndirection)
+
     def __repr__(self):
         for result in self.getEvalStrGen():
             pass
@@ -816,6 +822,60 @@ class FPTObjsOfType(Job):
         if self._doneCallback:
             self._doneCallback(self)
 
+class FPTObjsNamed(Job):
+    def __init__(self, name, leakDetector, on, doneCallback=None):
+        Job.__init__(self, name)
+        self._leakDetector = leakDetector
+        self.notify = self._leakDetector.notify
+        self._on = on
+        self._doneCallback = doneCallback
+        self._ldde = self._leakDetector._getDestroyEvent()
+        self.accept(self._ldde, self._handleLDDestroy)
+        ContainerLeakDetector.addPrivateObj(self.__dict__)
+
+    def destroy(self):
+        self.ignore(self._ldde)
+        self._leakDetector = None
+        self._doneCallback = None
+        ContainerLeakDetector.removePrivateObj(self.__dict__)
+        Job.destroy(self)
+
+    def _handleLDDestroy(self):
+        self.destroy()
+        
+    def getPriority(self):
+        return Job.Priorities.High
+    
+    def run(self):
+        ids = self._leakDetector.getContainerIds()
+        try:
+            for id in ids:
+                yield None
+                try:
+                    for container in self._leakDetector.getContainerByIdGen(id):
+                        yield None
+                except:
+                    pass
+                else:
+                    name = self._leakDetector._id2ref[id].getFinalIndirectionStr()
+                    if self._on.lower() in name.lower():
+                        try:
+                            for ptc in self._leakDetector.getContainerNameByIdGen(id):
+                                yield None
+                        except:
+                            pass
+                        else:
+                            print 'GPTCN(' + self._on + '):' + self.getJobName() + ': ' + ptc
+        except Exception, e:
+            print 'FPTObjsNamed job caught exception: %s' % e
+            if __dev__:
+                raise
+        yield Job.Done
+
+    def finished(self):
+        if self._doneCallback:
+            self._doneCallback(self)
+
 class PruneObjectRefs(Job):
     """
     Job to destroy any container refs that are no longer valid.
@@ -991,6 +1051,11 @@ class ContainerLeakDetector(Job):
         jobMgr.add(j)
         return j
         
+    def getPathsToContainersNamed(self, name, on, doneCallback=None):
+        j =  FPTObjsNamed(name, self, on, doneCallback)
+        jobMgr.add(j)
+        return j
+        
     def _scheduleNextLeakCheck(self):
         taskMgr.doMethodLater(self._nextCheckDelay, self._checkForLeaks,
                               self._getCheckTaskName())