https://github.com/python/cpython/commit/f183996eb77fd2d5662c62667298c292c943ebf5
commit: f183996eb77fd2d5662c62667298c292c943ebf5
branch: main
author: Kumar Aditya <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-07-21T20:35:25Z
summary:
gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads`
(#136951)
In free-threading, multiple threads can be cleared concurrently as such the
modifications on `sys_tracing_threads` should be done while holding the profile
lock, otherwise it can race with other threads setting up profiling.
files:
M Python/pystate.c
diff --git a/Python/pystate.c b/Python/pystate.c
index 0d4c26f92cec90..04ca6edb4aaa0e 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1682,6 +1682,10 @@ PyThreadState_Clear(PyThreadState *tstate)
"PyThreadState_Clear: warning: thread still has a generator\n");
}
+#ifdef Py_GIL_DISABLED
+ PyMutex_Lock(&_PyRuntime.ceval.sys_trace_profile_mutex);
+#endif
+
if (tstate->c_profilefunc != NULL) {
tstate->interp->sys_profiling_threads--;
tstate->c_profilefunc = NULL;
@@ -1690,6 +1694,11 @@ PyThreadState_Clear(PyThreadState *tstate)
tstate->interp->sys_tracing_threads--;
tstate->c_tracefunc = NULL;
}
+
+#ifdef Py_GIL_DISABLED
+ PyMutex_Unlock(&_PyRuntime.ceval.sys_trace_profile_mutex);
+#endif
+
Py_CLEAR(tstate->c_profileobj);
Py_CLEAR(tstate->c_traceobj);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]