From 6ffac127df5f3740c654dd95d4fed4ba018797e6 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Wed, 26 Feb 2025 21:16:25 +0000 Subject: [PATCH] gh-130605: Use relaxed atomics to set the GIL switch interval The interval may be concurrently read by a thread attempting to acquire the GIL. --- Python/ceval_gil.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index 416eec01052224..7a3cd8d8044739 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -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); }