]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-130605: Use relaxed atomics to set the GIL switch interval (gh-130654)
authorSam Gross <colesbury@gmail.com>
Fri, 28 Feb 2025 14:27:18 +0000 (09:27 -0500)
committerGitHub <noreply@github.com>
Fri, 28 Feb 2025 14:27:18 +0000 (09:27 -0500)
The interval may be concurrently read by a thread attempting to acquire
the GIL.

Python/ceval_gil.c

index 416eec01052224855e3aef4c6f1c4b0c5686ca3e..7a3cd8d80447394f46c32d355d735054ce4ee18b 100644 (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);
 }