mirror of
https://github.com/python/cpython.git
synced 2025-07-10 04:45:36 +00:00
bpo-42350: Fix Thread._reset_internal_locks() (GH-23268)
Fix the threading.Thread class at fork: do nothing if the thread is already stopped (ex: fork called at Python exit). Previously, an error was logged in the child process.
This commit is contained in:
parent
3df5c68487
commit
5909a494cd
3 changed files with 38 additions and 2 deletions
|
@ -469,6 +469,35 @@ class ThreadTests(BaseTestCase):
|
|||
t = threading.Thread(daemon=True)
|
||||
self.assertTrue(t.daemon)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'fork'), 'needs os.fork()')
|
||||
def test_fork_at_exit(self):
|
||||
# bpo-42350: Calling os.fork() after threading._shutdown() must
|
||||
# not log an error.
|
||||
code = textwrap.dedent("""
|
||||
import atexit
|
||||
import os
|
||||
import sys
|
||||
from test.support import wait_process
|
||||
|
||||
# Import the threading module to register its "at fork" callback
|
||||
import threading
|
||||
|
||||
def exit_handler():
|
||||
pid = os.fork()
|
||||
if not pid:
|
||||
print("child process ok", file=sys.stderr, flush=True)
|
||||
# child process
|
||||
sys.exit()
|
||||
else:
|
||||
wait_process(pid, exitcode=0)
|
||||
|
||||
# exit_handler() will be called after threading._shutdown()
|
||||
atexit.register(exit_handler)
|
||||
""")
|
||||
_, out, err = assert_python_ok("-c", code)
|
||||
self.assertEqual(out, b'')
|
||||
self.assertEqual(err.rstrip(), b'child process ok')
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'fork'), 'test needs fork()')
|
||||
def test_dummy_thread_after_fork(self):
|
||||
# Issue #14308: a dummy thread in the active list doesn't mess up
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue