diff options
| author | Brett Cannon <bcannon@gmail.com> | 2005-11-23 02:15:50 +0000 |
|---|---|---|
| committer | Brett Cannon <bcannon@gmail.com> | 2005-11-23 02:15:50 +0000 |
| commit | ad07ff2c77699c49b99140c0e1f36bfcdc9b2e17 (patch) | |
| tree | 9dff63c51f2b08de5b74b77dae1c24aa85fa2fe5 /Lib/threading.py | |
| parent | 5c6e0a1a0cac0b918e2a6ed7573db49cf6d0f6a5 (diff) | |
| download | cpython-git-ad07ff2c77699c49b99140c0e1f36bfcdc9b2e17.tar.gz | |
Prevent threading.Thread.join() from blocking when a previous call raised an
exception (e.g., passing in an illegal argument).
Applies patch #1314396. Thanks Eric Blossom.
Diffstat (limited to 'Lib/threading.py')
| -rw-r--r-- | Lib/threading.py | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/Lib/threading.py b/Lib/threading.py index fe4490fa3a..9cc108e087 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -536,24 +536,26 @@ class Thread(_Verbose): if not self.__stopped: self._note("%s.join(): waiting until thread stops", self) self.__block.acquire() - if timeout is None: - while not self.__stopped: - self.__block.wait() - if __debug__: - self._note("%s.join(): thread stopped", self) - else: - deadline = _time() + timeout - while not self.__stopped: - delay = deadline - _time() - if delay <= 0: - if __debug__: - self._note("%s.join(): timed out", self) - break - self.__block.wait(delay) - else: + try: + if timeout is None: + while not self.__stopped: + self.__block.wait() if __debug__: self._note("%s.join(): thread stopped", self) - self.__block.release() + else: + deadline = _time() + timeout + while not self.__stopped: + delay = deadline - _time() + if delay <= 0: + if __debug__: + self._note("%s.join(): timed out", self) + break + self.__block.wait(delay) + else: + if __debug__: + self._note("%s.join(): thread stopped", self) + finally: + self.__block.release() def getName(self): assert self.__initialized, "Thread.__init__() not called" |
