diff options
author | Kristján Valur Jónsson <kristjan@ccpgames.com> | 2010-11-18 12:46:39 (GMT) |
---|---|---|
committer | Kristján Valur Jónsson <kristjan@ccpgames.com> | 2010-11-18 12:46:39 (GMT) |
commit | 63315209506dafe15cb3e894f33793cbacadca20 (patch) | |
tree | 40673a47438aa4f73259f50d2a9919d429df2ff9 /Lib/threading.py | |
parent | bcc481000296a2227600ee59e92f0f78f541a32d (diff) | |
download | cpython-63315209506dafe15cb3e894f33793cbacadca20.zip cpython-63315209506dafe15cb3e894f33793cbacadca20.tar.gz cpython-63315209506dafe15cb3e894f33793cbacadca20.tar.bz2 |
Issue 10260
Adding the wait_for() method to threading.Condition
Diffstat (limited to 'Lib/threading.py')
-rw-r--r-- | Lib/threading.py | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/Lib/threading.py b/Lib/threading.py index 41956ed..b6c1e5d 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -254,6 +254,32 @@ class _Condition(_Verbose): finally: self._acquire_restore(saved_state) + def wait_for(self, predicate, timeout=None): + endtime = None + waittime = timeout + result = predicate() + while not result: + if waittime is not None: + if endtime is None: + endtime = _time() + waittime + else: + waittime = endtime - _time() + if waittime <= 0: + if __debug__: + self._note("%s.wait_for(%r, %r): Timed out.", + self, predicate, timeout) + break + if __debug__: + self._note("%s.wait_for(%r, %r): Waiting with timeout=%s.", + self, predicate, timeout, waittime) + self.wait(waittime) + result = predicate() + else: + if __debug__: + self._note("%s.wait_for(%r, %r): Success.", + self, predicate, timeout) + return result + def notify(self, n=1): if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") @@ -482,13 +508,12 @@ class Barrier(_Verbose): # Wait in the barrier until we are relased. Raise an exception # if the barrier is reset or broken. def _wait(self, timeout): - while self._state == 0: - if self._cond.wait(timeout) is False: - #timed out. Break the barrier - self._break() - raise BrokenBarrierError - if self._state < 0: - raise BrokenBarrierError + if not self._cond.wait_for(lambda : self._state != 0, timeout): + #timed out. Break the barrier + self._break() + raise BrokenBarrierError + if self._state < 0: + raise BrokenBarrierError assert self._state == 1 # If we are the last thread to exit the barrier, signal any threads |