remove reference cycle from ExpiringDict and made its expiry loop stop on garbage...
authorForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 04:51:40 +0000 (23:51 -0500)
committerForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 05:24:04 +0000 (00:24 -0500)
p2pool/util/expiring_dict.py

index edae4b3..8093bbf 100644 (file)
@@ -1,6 +1,7 @@
 from __future__ import division
 
 import time
+import weakref
 
 from twisted.internet import task
 
@@ -103,8 +104,10 @@ class ExpiringDict(object):
         
         self.expiry_deque = LinkedList()
         self.d = dict() # key -> node, value
-        self._expire_loop = task.LoopingCall(self.expire)
-        self._expire_loop.start(1) # XXX use inlinecallbacks and stop expiring at some point
+        
+        self_ref = weakref.ref(self, lambda _: expire_loop.stop() if expire_loop.running else None)
+        self._expire_loop = expire_loop = task.LoopingCall(lambda: self_ref().expire())
+        expire_loop.start(1)
     
     def stop(self):
         self._expire_loop.stop()