mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
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:
parent
c1b4a6bd61
commit
038e4d606b
1 changed files with 6 additions and 3 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue