[3.13] gh-132542: Set native thread ID after fork (GH-132701) (GH-134361)

(cherry picked from commit 6b73502313)
This commit is contained in:
Noam Cohen 2025-05-20 20:03:19 +03:00 committed by GitHub
parent bad9f63f6c
commit aebbbaffe8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 0 deletions

View File

@ -1208,6 +1208,34 @@ def f():
self.assertEqual(err, b'')
@skip_unless_reliable_fork
def test_native_id_after_fork(self):
script = """if True:
import threading
import os
from test import support
parent_thread_native_id = threading.current_thread().native_id
print(parent_thread_native_id, flush=True)
assert parent_thread_native_id == threading.get_native_id()
childpid = os.fork()
if childpid == 0:
print(threading.current_thread().native_id, flush=True)
assert threading.current_thread().native_id == threading.get_native_id()
else:
try:
assert parent_thread_native_id == threading.current_thread().native_id
assert parent_thread_native_id == threading.get_native_id()
finally:
support.wait_process(childpid, exitcode=0)
"""
rc, out, err = assert_python_ok('-c', script)
self.assertEqual(rc, 0)
self.assertEqual(err, b"")
native_ids = out.strip().splitlines()
self.assertEqual(len(native_ids), 2)
self.assertNotEqual(native_ids[0], native_ids[1])
class ThreadJoinOnShutdown(BaseTestCase):
def _run_and_join(self, script):

View File

@ -932,6 +932,8 @@ def _after_fork(self, new_ident=None):
# This thread is alive.
self._ident = new_ident
assert self._handle.ident == new_ident
if _HAVE_THREAD_NATIVE_ID:
self._set_native_id()
else:
# Otherwise, the thread is dead, Jim. _PyThread_AfterFork()
# already marked our handle done.

View File

@ -0,0 +1,2 @@
Update :attr:`Thread.native_id <threading.Thread.native_id>` after
:manpage:`fork(2)` to ensure accuracy. Patch by Noam Cohen.