From 6a849608111b191226cfcb2c0dda81b41b41e479 Mon Sep 17 00:00:00 2001 From: Goffi Date: Mon, 2 Nov 2015 22:02:41 +0100 Subject: [PATCH] =?UTF-8?q?core=20(tools):=20=E2=80=9CDelayedDeferred?= =?UTF-8?q?=E2=80=9D=20implementation,=20which=20is=20a=20Deferred=20launc?= =?UTF-8?q?hed=20after=20a=20delay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/sat_defer.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/tools/sat_defer.py b/src/tools/sat_defer.py index b99261c7..0d655e5a 100644 --- a/src/tools/sat_defer.py +++ b/src/tools/sat_defer.py @@ -23,6 +23,8 @@ from sat.core.log import getLogger 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_DEFERREDS = 'deferreds' 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"""