diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -324,40 +324,38 @@ raise ValueError("can't specify timeout for non-blocking acquire") rc = False endtime = None - self._cond.acquire() - while self._value == 0: - if not blocking: - break - if __debug__: - self._note("%s.acquire(%s): blocked waiting, value=%s", - self, blocking, self._value) - if timeout is not None: - if endtime is None: - endtime = _time() + timeout - else: - timeout = endtime - _time() - if timeout <= 0: - break - self._cond.wait(timeout) - else: - self._value = self._value - 1 - if __debug__: - self._note("%s.acquire: success, value=%s", - self, self._value) - rc = True - self._cond.release() + with self._cond: + while self._value == 0: + if not blocking: + break + if __debug__: + self._note("%s.acquire(%s): blocked waiting, value=%s", + self, blocking, self._value) + if timeout is not None: + if endtime is None: + endtime = _time() + timeout + else: + timeout = endtime - _time() + if timeout <= 0: + break + self._cond.wait(timeout) + else: + self._value = self._value - 1 + if __debug__: + self._note("%s.acquire: success, value=%s", + self, self._value) + rc = True return rc __enter__ = acquire def release(self): - self._cond.acquire() - self._value = self._value + 1 - if __debug__: - self._note("%s.release: success, value=%s", - self, self._value) - self._cond.notify() - self._cond.release() + with self._cond: + self._value = self._value + 1 + if __debug__: + self._note("%s.release: success, value=%s", + self, self._value) + self._cond.notify() def __exit__(self, t, v, tb): self.release() @@ -400,28 +398,19 @@ isSet = is_set def set(self): - self._cond.acquire() - try: + with self._cond: self._flag = True self._cond.notify_all() - finally: - self._cond.release() def clear(self): - self._cond.acquire() - try: + with self._cond: self._flag = False - finally: - self._cond.release() def wait(self, timeout=None): - self._cond.acquire() - try: + with self._cond: if not self._flag: self._cond.wait(timeout) return self._flag - finally: - self._cond.release() # A barrier class. Inspired in part by the pthread_barrier_* api and