diff --git a/gestion/lock.py b/gestion/lock.py index 13baabc1..44a411de 100755 --- a/gestion/lock.py +++ b/gestion/lock.py @@ -13,6 +13,29 @@ from user_tests import getuser from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN import errno +def wait_lock(lock_name, lock_comment='', d=None): + """Attend la disponibilité d'un lock en utilisant le framework Twisted. + + Si d est de type Deferred, on est en mode asynchrone. + """ + from twisted.internet import reactor, defer + try: + make_lock(lock_name, lock_comment, quiet=True) + # On a le lock + if not d: + # On est en mode synchrone + return defer.succeed(None) + # On appelle le callback car on est en mode asynchrone + d.callback() + except AssertionError: + # On a pas le lock + if not d: + # On est en mode synchrone, on va passer en asynchrone + d = defer.Deferred() + # On essaie de nouveau dans 200 ms. + reactor.callLater(0.2, wait_lock, lock_name, lock_comment, d) + return d + def make_lock(lock_name, lock_comment='',nowait=1, quiet=False) : """ Création d'un lock si nowait=1 fait un sys.exit(254) quand un ancien lock actif est rencontré