From 8f034d9af2c36cd3451fac5044a700da77a96bd5 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Tue, 22 Jan 2008 01:29:11 +0000 Subject: [PATCH] Backport of r60190: - Fix Issue #1703448: A joined thread could show up in the threading.enumerate() list after the join() for a brief period until it actually exited. --- Lib/test/test_threading.py | 19 +++++++++++++++++++ Lib/threading.py | 14 ++++++++++---- Misc/NEWS | 4 ++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 8614ecb49c9..7c648186f29 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -3,6 +3,7 @@ import test.test_support from test.test_support import verbose import random +import sys import threading import thread import time @@ -201,6 +202,24 @@ class ThreadTests(unittest.TestCase): t.join() # else the thread is still running, and we have no way to kill it + def test_enumerate_after_join(self): + # Try hard to trigger #1703448: a thread is still returned in + # threading.enumerate() after it has been join()ed. + enum = threading.enumerate + old_interval = sys.getcheckinterval() + sys.setcheckinterval(1) + try: + for i in xrange(1, 1000): + t = threading.Thread(target=lambda: None) + t.start() + t.join() + l = enum() + self.assertFalse(t in l, + "#1703448 triggered after %d trials: %s" % (i, l)) + finally: + sys.setcheckinterval(old_interval) + + def test_main(): test.test_support.run_unittest(ThreadTests) diff --git a/Lib/threading.py b/Lib/threading.py index 7b072656702..bab3b426414 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -524,11 +524,17 @@ class Thread(_Verbose): if __debug__: self._note("%s.__bootstrap(): normal return", self) finally: - self.__stop() + _active_limbo_lock.acquire() try: - self.__delete() - except: - pass + self.__stop() + try: + # We don't call self.__delete() because it also + # grabs _active_limbo_lock. + del _active[_get_ident()] + except: + pass + finally: + _active_limbo_lock.release() def __stop(self): self.__block.acquire() diff --git a/Misc/NEWS b/Misc/NEWS index dd06f601578..1fa60b0d803 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -55,6 +55,10 @@ Core and builtins - Bug #1733488: Fix compilation of bufferobject.c on AIX. +- Fix Issue #1703448: A joined thread could show up in the + threading.enumerate() list after the join() for a brief period until + it actually exited. + Library -------