Skip to content

Commit

Permalink
pythongh-129533: Update PyGC_Enable/Disable/IsEnabled to use atomic …
Browse files Browse the repository at this point in the history
…operation (pythongh-129563)
  • Loading branch information
corona10 authored and srinivasreddy committed Feb 7, 2025
1 parent 60c6767 commit 9e29b4f
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Update :c:func:`PyGC_Enable()`, :c:func:`PyGC_Disable()`,
:c:func:`PyGC_IsEnabled()` to use atomic operation for thread-safety
at free-threading build. Patch by Donghee Na.
18 changes: 7 additions & 11 deletions Python/gc_free_threading.c
Original file line number Diff line number Diff line change
Expand Up @@ -1864,7 +1864,8 @@ gc_should_collect(GCState *gcstate)
{
int count = _Py_atomic_load_int_relaxed(&gcstate->young.count);
int threshold = gcstate->young.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
Expand Down Expand Up @@ -2340,25 +2341,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 */
Expand All @@ -2368,7 +2365,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;
}

Expand Down Expand Up @@ -2527,8 +2524,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);
Expand Down

0 comments on commit 9e29b4f

Please sign in to comment.