Issue #18418: After fork(), reinit all threads states, not only active ones.
Patch by A. Jesse Jiryu Davis.
This commit is contained in:
parent
dee0434e2f
commit
9939cc89a4
@ -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):
|
||||
|
||||
|
@ -935,7 +935,7 @@ def _after_fork():
|
||||
new_active = {}
|
||||
current = current_thread()
|
||||
with _active_limbo_lock:
|
||||
for thread in _active.values():
|
||||
for thread in _enumerate():
|
||||
# Any lock/condition variable may be currently locked or in an
|
||||
# invalid state, so we reinitialize them.
|
||||
thread._reset_internal_locks()
|
||||
|
@ -279,6 +279,7 @@ Ben Darnell
|
||||
Kushal Das
|
||||
Jonathan Dasteel
|
||||
Pierre-Yves David
|
||||
A. Jesse Jiryu Davis
|
||||
John DeGood
|
||||
Ned Deily
|
||||
Vincent Delft
|
||||
|
Loading…
x
Reference in New Issue
Block a user