summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorDonghee Na <donghee.na@python.org>2025-02-06 23:11:17 (GMT)
committerGitHub <noreply@github.com>2025-02-06 23:11:17 (GMT)
commitf7af8bc58aaa0c76028ddee54e635daedcd1b40c (patch)
treeabd255d9a53f228e727ab2af77492cd2b26d3556 /Python
parentf7cc8623457ed0f79bddd32dd680303584684641 (diff)
downloadcpython-f7af8bc58aaa0c76028ddee54e635daedcd1b40c.zip
cpython-f7af8bc58aaa0c76028ddee54e635daedcd1b40c.tar.gz
cpython-f7af8bc58aaa0c76028ddee54e635daedcd1b40c.tar.bz2
[3.13] gh-129533: Update PyGC_Enable/Disable/IsEnabled to use atomic operat… (gh-129756)
gh-129533: Update PyGC_Enable/Disable/IsEnabled to use atomic operation (gh-129563) (cherry picked from commit b184abf074c0e1f379a238f07da5616460f36b93)
Diffstat (limited to 'Python')
-rw-r--r--Python/gc_free_threading.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index ff86c75..6a38cc2 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -1059,7 +1059,8 @@ gc_should_collect(GCState *gcstate)
{
int count = _Py_atomic_load_int_relaxed(&gcstate->generations[0].count);
int threshold = gcstate->generations[0].threshold;
- if (count <= threshold || threshold == 0 || !gcstate->enabled) {
+ int gc_enabled = _Py_atomic_load_int_relaxed(&gcstate->enabled);
+ if (count <= threshold || threshold == 0 || !gc_enabled) {
return false;
}
// Avoid quadratic behavior by scaling threshold to the number of live
@@ -1495,25 +1496,21 @@ int
PyGC_Enable(void)
{
GCState *gcstate = get_gc_state();
- int old_state = gcstate->enabled;
- gcstate->enabled = 1;
- return old_state;
+ return _Py_atomic_exchange_int(&gcstate->enabled, 1);
}
int
PyGC_Disable(void)
{
GCState *gcstate = get_gc_state();
- int old_state = gcstate->enabled;
- gcstate->enabled = 0;
- return old_state;
+ return _Py_atomic_exchange_int(&gcstate->enabled, 0);
}
int
PyGC_IsEnabled(void)
{
GCState *gcstate = get_gc_state();
- return gcstate->enabled;
+ return _Py_atomic_load_int_relaxed(&gcstate->enabled);
}
/* Public API to invoke gc.collect() from C */
@@ -1523,7 +1520,7 @@ PyGC_Collect(void)
PyThreadState *tstate = _PyThreadState_GET();
GCState *gcstate = &tstate->interp->gc;
- if (!gcstate->enabled) {
+ if (!_Py_atomic_load_int_relaxed(&gcstate->enabled)) {
return 0;
}
@@ -1681,8 +1678,7 @@ _PyObject_GC_Link(PyObject *op)
void
_Py_RunGC(PyThreadState *tstate)
{
- GCState *gcstate = get_gc_state();
- if (!gcstate->enabled) {
+ if (!PyGC_IsEnabled()) {
return;
}
gc_collect_main(tstate, 0, _Py_GC_REASON_HEAP);