gh-130605: Use relaxed atomics to set the GIL switch interval (gh-130654)

The interval may be concurrently read by a thread attempting to acquire
the GIL.
This commit is contained in:
Sam Gross 2025-02-28 09:27:18 -05:00 committed by GitHub
parent c1b4a6bd61
commit 038e4d606b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -325,7 +325,10 @@ take_gil(PyThreadState *tstate)
while (_Py_atomic_load_int_relaxed(&gil->locked)) {
unsigned long saved_switchnum = gil->switch_number;
unsigned long interval = (gil->interval >= 1 ? gil->interval : 1);
unsigned long interval = _Py_atomic_load_ulong_relaxed(&gil->interval);
if (interval < 1) {
interval = 1;
}
int timed_out = 0;
COND_TIMED_WAIT(gil->cond, gil->mutex, interval, timed_out);
@ -420,7 +423,7 @@ void _PyEval_SetSwitchInterval(unsigned long microseconds)
PyInterpreterState *interp = _PyInterpreterState_GET();
struct _gil_runtime_state *gil = interp->ceval.gil;
assert(gil != NULL);
gil->interval = microseconds;
_Py_atomic_store_ulong_relaxed(&gil->interval, microseconds);
}
unsigned long _PyEval_GetSwitchInterval(void)
@ -428,7 +431,7 @@ unsigned long _PyEval_GetSwitchInterval(void)
PyInterpreterState *interp = _PyInterpreterState_GET();
struct _gil_runtime_state *gil = interp->ceval.gil;
assert(gil != NULL);
return gil->interval;
return _Py_atomic_load_ulong_relaxed(&gil->interval);
}