Browse Source

proactive leak detection for distributed objects

Darren Ranalli 17 years ago
parent
commit
e185892eb1

+ 9 - 0
direct/src/distributed/CRCache.py

@@ -32,6 +32,9 @@ class CRCache:
             distObj.deleteOrDelay()
             if distObj.getDelayDeleteCount() != 0:
                 delayDeleted.append(distObj)
+            if distObj.getDelayDeleteCount() <= 0:
+                # make sure we're not leaking
+                distObj.detectLeaks()
         # now that all objects have had a chance to delete, are there any objects left
         # that are still delayDeleted?
         delayDeleteLeaks = []
@@ -76,6 +79,9 @@ class CRCache:
                 del(self.dict[oldestDistObj.getDoId()])
                 # and delete it
                 oldestDistObj.deleteOrDelay()
+                if oldestDistObj.getDelayDeleteCount() <= 0:
+                    # make sure we're not leaking
+                    oldestDistObj.detectLeaks()
 
         # Make sure that the fifo and the dictionary are sane
         assert len(self.dict) == len(self.fifo)
@@ -109,6 +115,9 @@ class CRCache:
         self.fifo.remove(distObj)
         # and delete it
         distObj.deleteOrDelay()
+        if distObj.getDelayDeleteCount() <= 0:
+            # make sure we're not leaking
+            distObj.detectLeaks()
 
     def checkCache(self):
         # For debugging; this verifies that the cache is sensible and

+ 5 - 3
direct/src/distributed/ClientRepositoryBase.py

@@ -490,12 +490,14 @@ class ClientRepositoryBase(ConnectionRepository):
             # object; this way we don't clutter up the caches with
             # trivial objects that don't benefit from caching.
             # also don't try to cache an object that is delayDeleted
+            cached = False
             if distObj.getCacheable() and distObj.getDelayDeleteCount() <= 0:
                 cached = cache.cache(distObj)
-                if not cached:
-                    distObj.deleteOrDelay()
-            else:
+            if not cached:
                 distObj.deleteOrDelay()
+                if distObj.getDelayDeleteCount() <= 0:
+                    # make sure we're not leaking
+                    distObj.detectLeaks()
 
         elif self.deferredDoIds.has_key(doId):
             # The object had been deferred.  Great; we don't even have