diff --git a/ccserver/utils.py b/ccserver/utils.py index 73fd24f635a33632fc41c3686444c27936084031..0c70ae5f21699c579235bf234edac27392fc893d 100644 --- a/ccserver/utils.py +++ b/ccserver/utils.py @@ -5,6 +5,8 @@ Some helpers used by cc-server. ''' +from threading import Lock + class Acquires(object): ''' @@ -34,3 +36,28 @@ class Acquires(object): def __exit__(self, exc_type, exc_value, traceback): for lock in self._locks: lock.release() + + +class AcquiresAllOrNone(Acquires): + + ''' + Class that extend Acquires to allow to release all lock if one of them + is not free. + ''' + + # Global acquire lock: + acquirelock = Lock() + + def __enter__(self): + while True: + with self.acquirelock: + acquired = [] + for lock in self._locks: + if not lock.acquire(False): + for lock_acquired in acquired: + lock_acquired.release() + break + else: + acquired.append(lock) + else: + break