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

Patch by A. Jesse Jiryu Davis.
This commit is contained in:
Charles-François Natali 2013-08-30 23:32:53 +02:00
parent dee0434e2f
commit 9939cc89a4
4 changed files with 26 additions and 1 deletions

View file

@ -444,6 +444,27 @@ class ThreadTests(BaseTestCase):
self.assertEqual(out, b'')
self.assertEqual(err, b'')
@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.getswitchinterval()
self.addCleanup(sys.setswitchinterval, old_interval)
# Make the bug more likely to manifest.
sys.setswitchinterval(1e-6)
for i in range(20):
t = threading.Thread(target=lambda: None)
t.start()
self.addCleanup(t.join)
pid = os.fork()
if pid == 0:
os._exit(1 if t.is_alive() else 0)
else:
pid, status = os.waitpid(pid, 0)
self.assertEqual(0, status)
class ThreadJoinOnShutdown(BaseTestCase):