replace task.LoopingCall's with deferral.RobustLoopingCall that catches errors and...
[p2pool.git] / p2pool / util / expiring_dict.py
index 081e85b..8a3c9ee 100644 (file)
@@ -1,9 +1,9 @@
 from __future__ import division
 
-import random
 import time
+import weakref
 
-from twisted.internet import task
+from p2pool.util import deferral
 
 class Node(object):
     def __init__(self, contents, prev=None, next=None):
@@ -104,7 +104,13 @@ class ExpiringDict(object):
         
         self.expiry_deque = LinkedList()
         self.d = dict() # key -> node, value
-        task.LoopingCall(self.expire).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 = deferral.RobustLoopingCall(lambda: self_ref().expire())
+        expire_loop.start(1)
+    
+    def stop(self):
+        self._expire_loop.stop()
     
     def __repr__(self):
         return 'ExpiringDict' + repr(self.__dict__)
@@ -172,23 +178,3 @@ class ExpiringDict(object):
     def itervalues(self):
         for node, value in self.d.itervalues():
             yield value
-
-if __name__ == '__main__':
-    x = ExpiringDict(5)
-    print x
-    
-    time.sleep(1)
-    
-    x[1] = 2
-    print 'x[1] = 2'
-    print x
-    
-    time.sleep(1)
-    
-    x[1] = 3
-    print 'x[1] = 3'
-    print x
-    
-    time.sleep(5)
-    
-    print x