]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport of patch #1314396: prevent threading.Thread.join() from blocking if a
authorBrett Cannon <bcannon@gmail.com>
Wed, 23 Nov 2005 02:19:18 +0000 (02:19 +0000)
committerBrett Cannon <bcannon@gmail.com>
Wed, 23 Nov 2005 02:19:18 +0000 (02:19 +0000)
previous call raised an exception (e.g., calling it with an illegal argument).

Lib/threading.py
Misc/NEWS

index 6def594326cc409285e8f5b8fab014df76e438e8..8788ee571c751003c1cabe335925da0c0c1b2617 100644 (file)
@@ -534,24 +534,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"
index 18c078464c013e97434909326260a304816401c8..b551b23f15b96b303eddec1a19124a718c24f161 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,10 @@ Extension Modules
 Library
 -------
 
+- Patch #1314396: Prevent threading.Thread.join() from blocking if a previous
+  call caused an exception to be raised (e.g., calling join() with an illegal
+  argument).
+
 - urllib.unquote() now handles Unicode strings correctly.  Formerly, it would
   either ignore the substitution or raise UnicodeDecodeError.