From 2550bca678a0aa9bcafadcfa517b1e575805f603 Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Thu, 3 Mar 2011 19:29:21 +0100 Subject: [PATCH] Added AcquiresAllOrNone class in utils. --- ccserver/utils.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ccserver/utils.py b/ccserver/utils.py index 73fd24f..0c70ae5 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 -- GitLab