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):
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()
Library
-------
+- Issue #18418: After fork(), reinit all threads states, not only active ones.
+ Patch by A. Jesse Jiryu Davis.
+
- Issue #16611: http.cookie now correctly parses the 'secure' and 'httponly'
cookie flags.