]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-142048: Fix quadratically increasing GC delays (gh-142051)
authorKevin Wang <kevmo314@gmail.com>
Tue, 2 Dec 2025 00:04:47 +0000 (19:04 -0500)
committerGitHub <noreply@github.com>
Tue, 2 Dec 2025 00:04:47 +0000 (19:04 -0500)
The GC for the free threaded build would get slower with each collection due
to effectively double counting objects freed by the GC.

Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst [new file with mode: 0644]
Python/gc_free_threading.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst
new file mode 100644 (file)
index 0000000..1400dae
--- /dev/null
@@ -0,0 +1,2 @@
+Fix quadratically increasing garbage collection delays in free-threaded
+build.
index 1717603b947f905aa1e2c1e82c1bcf16258ee826..e672e870db2f27e10fdfa2c73a40b4ff973f65f1 100644 (file)
@@ -2210,7 +2210,19 @@ record_deallocation(PyThreadState *tstate)
     gc->alloc_count--;
     if (gc->alloc_count <= -LOCAL_ALLOC_COUNT_THRESHOLD) {
         GCState *gcstate = &tstate->interp->gc;
-        _Py_atomic_add_int(&gcstate->young.count, (int)gc->alloc_count);
+        int count = _Py_atomic_load_int_relaxed(&gcstate->young.count);
+        int new_count;
+        do {
+            if (count == 0) {
+                break;
+            }
+            new_count = count + (int)gc->alloc_count;
+            if (new_count < 0) {
+                new_count = 0;
+            }
+        } while (!_Py_atomic_compare_exchange_int(&gcstate->young.count,
+                                                  &count,
+                                                  new_count));
         gc->alloc_count = 0;
     }
 }