Darren Ranalli 19 роки тому
батько
коміт
0d9399a33f
1 змінених файлів з 75 додано та 0 видалено
  1. 75 0
      direct/src/showbase/GarbageReport.py

+ 75 - 0
direct/src/showbase/GarbageReport.py

@@ -0,0 +1,75 @@
+from direct.directnotify import DirectNotifyGlobal
+from direct.showbase import PythonUtil
+import gc
+
+class GarbageReport:
+    notify = DirectNotifyGlobal.directNotify.newCategory("GarbageReport")
+
+    def __init__(self, name=None):
+        wasOn = PythonUtil.gcDebugOn()
+        if not wasOn:
+            gc.set_debug(gc.DEBUG_LEAK)
+        gc.collect()
+        garbage = list(gc.garbage)
+        del gc.garbage[:]
+        if not wasOn:
+            gc.set_debug(0)
+
+        numGarbage = len(garbage)
+        # grab the referents
+        referentsByReference = {}
+        referentsByNumber = {}
+        for i in xrange(numGarbage):
+            referents = gc.get_referents(garbage[i])
+            referentsByReference[i] = list(referents)
+            # look to see if each referent is another garbage item
+            referentsByNumber[i] = list()
+            for referent in referents:
+                try:
+                    num = garbage.index(referent)
+                except:
+                    num = 'NG' # Not Garbage
+                referentsByNumber[i].append(num)
+        # grab the referrers
+        referrersByReference = {}
+        referrersByNumber = {}
+        for i in xrange(numGarbage):
+            referrers = gc.get_referrers(garbage[i])
+            referrersByReference[i] = list(referrers)
+            # look to see if each referrer is another garbage item
+            referrersByNumber[i] = list()
+            for referrer in referrers:
+                try:
+                    num = garbage.index(referrer)
+                except:
+                    num = 'NG' # Not Garbage
+                referrersByNumber[i].append(num)
+
+        s = '\n===== GarbageReport: \'%s\' (%s items) =====' % (name, numGarbage)
+        if numGarbage > 0:
+            # log each individual item with a number in front of it
+            s += '\n\n===== Garbage Items ====='
+            digits = 0
+            n = numGarbage
+            while n > 0:
+                digits += 1
+                n /= 10
+            format = '\n%0' + '%s' % digits + 'i:%s \t%s'
+            for i in range(len(garbage)):
+                s += format % (i, type(garbage[i]), garbage[i])
+
+            format = '\n%0' + '%s' % digits + 'i:%s'
+            s += '\n\n===== Referents By Number (what is garbage item referring to?) NG=NonGarbage ====='
+            for i in xrange(numGarbage):
+                s += format % (i, referentsByNumber[i])
+            s += '\n\n===== Referrers By Number (what is referring to garbage item?) NG=NonGarbage ====='
+            for i in xrange(numGarbage):
+                s += format % (i, referrersByNumber[i])
+            s += '\n\n===== Referents (what is garbage item referring to?) ====='
+            for i in xrange(numGarbage):
+                s += format % (i, referentsByReference[i])
+            s += '\n\n===== Referrers (what is referring to garbage item?) ====='
+            for i in xrange(numGarbage):
+                s += format % (i, referrersByReference[i])
+
+        self.notify.info(s)