oldschool-toontown/otp/otpbase/ObjectCount.py
2019-12-30 01:00:16 -05:00

48 lines
1.3 KiB
Python

from direct.showbase.Job import Job
import gc
class ObjectCount(Job):
""" logs a count of the number of each type of object found in gc.get_objects() """
def __init__(self, name, immediate=False, doneCallback=None):
Job.__init__(self, name)
self._doneCallback = doneCallback
jobMgr.add(self)
if immediate:
jobMgr.finish(self)
def destroy(self):
self._doneCallback = None
Job.destroy(self)
def finished(self):
if self._doneCallback:
self._doneCallback(self)
self.destroy()
def run(self):
objs = gc.get_objects()
yield None
type2count = {}
for obj in objs:
tn = safeTypeName(obj)
type2count.setdefault(tn, 0)
type2count[tn] += 1
yield None
# prevent garbage cycle
del objs
yield None
count2type = invertDictLossless(type2count)
yield None
counts = list(count2type.keys())
yield None
counts.sort()
yield None
counts.reverse()
yield None
print('===== ObjectCount: \'%s\' =====' % (self.getJobName()))
for count in counts:
types = count2type[count]
for type in types:
print('%s: %s' % (count, type))
yield None
yield Job.Done