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.
This commit is contained in:
Kumar Aditya 2025-07-22 02:05:25 +05:30 committed by GitHub
parent 3224429450
commit f183996eb7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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);