aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/pystate.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2025-02-27 13:57:19 -0500
committerGitHub <noreply@github.com>2025-02-27 13:57:19 -0500
commit7aeaa5af2c32f1f87b59f36f89e19284e24b26b9 (patch)
treed0f0151722c8ae1dc9db292618e73f017be5c089 /Python/pystate.c
parente06bebb87e1b33f7251196e1ddb566f528c3fc98 (diff)
downloadcpython-7aeaa5af2c32f1f87b59f36f89e19284e24b26b9.tar.gz
cpython-7aeaa5af2c32f1f87b59f36f89e19284e24b26b9.zip
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`.
Diffstat (limited to 'Python/pystate.c')
-rw-r--r--Python/pystate.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index 9ebd9fdea60..72e2627e95b 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -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) {