added cancellation support to util.deferral.GenericDeferrer
authorForrest Voight <forrest@forre.st>
Wed, 3 Oct 2012 01:55:42 +0000 (21:55 -0400)
committerForrest Voight <forrest@forre.st>
Wed, 3 Oct 2012 01:56:20 +0000 (21:56 -0400)
p2pool/util/deferral.py

index dfc9515..71fe633 100644 (file)
@@ -100,14 +100,17 @@ class GenericDeferrer(object):
             id = random.randrange(self.max_id)
             if id not in self.map:
                 break
-        df = defer.Deferred()
+        def cancel(df):
+            df, timer = self.map.pop(id)
+            timer.cancel()
+        df = defer.Deferred(cancel)
         def timeout():
             self.map.pop(id)
             df.errback(failure.Failure(defer.TimeoutError('in GenericDeferrer')))
             self.on_timeout()
         timer = reactor.callLater(self.timeout, timeout)
-        self.func(id, *args, **kwargs)
         self.map[id] = df, timer
+        self.func(id, *args, **kwargs)
         return df
     
     def got_response(self, id, resp):