Issue #18418: After fork(), reinit all threads states, not only active ones.

Patch by A. Jesse Jiryu Davis.
parent b2fa280e
......@@ -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):
......
......@@ -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'):
......
......@@ -230,6 +230,7 @@ Scott David Daniels
Ben Darnell
Kushal Das
Jonathan Dasteel
A. Jesse Jiryu Davis
John DeGood
Ned Deily
Vincent Delft
......
......@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment