gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads` (GH-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.
(cherry picked from commit
f183996eb77fd2d5662c62667298c292c943ebf5)
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
"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;
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);