gh-130091: Reorder _PyThreadState_Attach to avoid data race (gh-130092)

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`.
This commit is contained in:
Sam Gross 2025-02-27 13:57:19 -05:00 committed by GitHub
parent e06bebb87e
commit 7aeaa5af2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View 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) {