]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-130091: Reorder `_PyThreadState_Attach` to avoid data race (gh-130092)
authorSam Gross <colesbury@gmail.com>
Thu, 27 Feb 2025 18:57:19 +0000 (13:57 -0500)
committerGitHub <noreply@github.com>
Thu, 27 Feb 2025 18:57:19 +0000 (13:57 -0500)
This moves `tstate_activate()` down to avoid a data race in the free
threading build on the `_PyRuntime`'s thread-local `autoTSSkey`. This
key is deleted during runtime finalization, which may happen
concurrently with a call to `_PyThreadState_Attach`.

The earlier `tstate_try/wait_attach` ensures that the thread is blocked
before it attempts to access the deleted `autoTSSkey`.

This fixes a TSAN reported data race in
`test_threading.test_import_from_another_thread`.

Python/pystate.c

index 9ebd9fdea607469ddb05d22b973220d9ca39b155..72e2627e95b5598d12cb8246d74accb686f00a6b 100644 (file)
@@ -2099,11 +2099,10 @@ _PyThreadState_Attach(PyThreadState *tstate)
 
         // XXX assert(tstate_is_alive(tstate));
         current_fast_set(&_PyRuntime, tstate);
-        tstate_activate(tstate);
-
         if (!tstate_try_attach(tstate)) {
             tstate_wait_attach(tstate);
         }
+        tstate_activate(tstate);
 
 #ifdef Py_GIL_DISABLED
         if (_PyEval_IsGILEnabled(tstate) && !tstate->_status.holds_gil) {