From: Charles-François Natali Date: Fri, 30 Aug 2013 21:30:50 +0000 (+0200) Subject: Issue #18418: After fork(), reinit all threads states, not only active ones. X-Git-Tag: v2.7.6rc1~186 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=30a5445b30bb627a64b2d30788f6db58f6db3ae1;p=thirdparty%2FPython%2Fcpython.git Issue #18418: After fork(), reinit all threads states, not only active ones. Patch by A. Jesse Jiryu Davis. --- diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index ef04cd360a4f..5a765f320837 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -443,6 +443,29 @@ class ThreadTests(BaseTestCase): self.assertEqual(out, '') self.assertEqual(err, '') + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_is_alive_after_fork(self): + # Try hard to trigger #18418: is_alive() could sometimes be True on + # threads that vanished after a fork. + old_interval = sys.getcheckinterval() + + # Make the bug more likely to manifest. + sys.setcheckinterval(10) + + try: + for i in range(20): + t = threading.Thread(target=lambda: None) + t.start() + pid = os.fork() + if pid == 0: + os._exit(1 if t.is_alive() else 0) + else: + t.join() + pid, status = os.waitpid(pid, 0) + self.assertEqual(0, status) + finally: + sys.setcheckinterval(old_interval) + class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 225448bf561f..72c83197fd1c 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1220,7 +1220,7 @@ def _after_fork(): new_active = {} current = current_thread() with _active_limbo_lock: - for thread in _active.itervalues(): + for thread in _enumerate(): # Any lock/condition variable may be currently locked or in an # invalid state, so we reinitialize them. if hasattr(thread, '_reset_internal_locks'): diff --git a/Misc/ACKS b/Misc/ACKS index 6a0639663135..8977c02fa28a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -230,6 +230,7 @@ Scott David Daniels Ben Darnell Kushal Das Jonathan Dasteel +A. Jesse Jiryu Davis John DeGood Ned Deily Vincent Delft diff --git a/Misc/NEWS b/Misc/NEWS index f7e937231654..9544b3b91356 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- Issue #18418: After fork(), reinit all threads states, not only active ones. + Patch by A. Jesse Jiryu Davis. + - Issue #11973: Fix a problem in kevent. The flags and fflags fields are now properly handled as unsigned.