# HG changeset patch # User Goffi # Date 1446498161 -3600 # Node ID e987325c14efd0082baef4b17c4bad2b95713840 # Parent 61c03265e133369e8214049a2028b867d9b0dad7 core (tools): “DelayedDeferred” implementation, which is a Deferred launched after a delay diff -r 61c03265e133 -r e987325c14ef src/tools/sat_defer.py --- a/src/tools/sat_defer.py Mon Nov 02 22:02:41 2015 +0100 +++ b/src/tools/sat_defer.py Mon Nov 02 22:02:41 2015 +0100 @@ -23,6 +23,8 @@ log = getLogger(__name__) from sat.core import exceptions from twisted.internet import defer +from twisted.internet import error as internet_error +from twisted.internet import reactor from twisted.python import failure from sat.core.constants import Const as C from sat.memory import memory @@ -31,6 +33,46 @@ KEY_NEXT = 'next_defer' +class DelayedDeferred(object): + """A Deferred-like which is launched after a delay""" + + def __init__(self, delay, result): + """ + @param delay(float): delay before launching the callback, in seconds + @param result: result used with the callback + """ + self._deferred = defer.Deferred() + self._timer = reactor.callLater(delay, self._deferred.callback, result) + + def cancel(self): + try: + self._timer.cancel() + except internet_error.AlreadyCalled: + pass + self._deferred.cancel() + + def addCallbacks(self, *args, **kwargs): + self._deferred.addCallbacks(*args,**kwargs) + + def addCallback(self, *args, **kwargs): + self._deferred.addCallback(*args,**kwargs) + + def addErrback(self, *args, **kwargs): + self._deferred.addErrback(*args,**kwargs) + + def addBoth(self, *args, **kwargs): + self._deferred.addBoth(*args,**kwargs) + + def chainDeferred(self, *args, **kwargs): + self._deferred.chainDeferred(*args,**kwargs) + + def pause(self): + self._deferred.pause() + + def unpause(self): + self._deferred.unpause() + + class RTDeferredSessions(memory.Sessions): """Real Time Deferred Sessions"""