aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/gc_free_threading.c
diff options
context:
space:
mode:
authorKumar Aditya <kumaraditya@python.org>2025-05-27 22:42:08 +0530
committerGitHub <noreply@github.com>2025-05-27 22:42:08 +0530
commitac539e7e0d1622c61988f30c91acfd4c06521ced (patch)
treeb4050825077ff435230460f2e232e4795df0c824 /Python/gc_free_threading.c
parenta380d578737be1cd51e1d1be2b83bbc0b0619e7e (diff)
downloadcpython-ac539e7e0d1622c61988f30c91acfd4c06521ced.tar.gz
cpython-ac539e7e0d1622c61988f30c91acfd4c06521ced.zip
gh-132917: fix data race on `last_mem` in free-threading gc (#134692)
Diffstat (limited to 'Python/gc_free_threading.c')
-rw-r--r--Python/gc_free_threading.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index d2ea5b5e06b..5aaa68c5b51 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -2062,7 +2062,7 @@ gc_should_collect_mem_usage(GCState *gcstate)
// 70,000 new container objects.
return true;
}
- Py_ssize_t last_mem = gcstate->last_mem;
+ Py_ssize_t last_mem = _Py_atomic_load_ssize_relaxed(&gcstate->last_mem);
Py_ssize_t mem_threshold = Py_MAX(last_mem / 10, 128);
if ((mem - last_mem) > mem_threshold) {
// The process memory usage has increased too much, do a collection.
@@ -2245,7 +2245,8 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state,
// Store the current memory usage, can be smaller now if breaking cycles
// freed some memory.
- state->gcstate->last_mem = get_process_mem_usage();
+ Py_ssize_t last_mem = get_process_mem_usage();
+ _Py_atomic_store_ssize_relaxed(&state->gcstate->last_mem, last_mem);
// Append objects with legacy finalizers to the "gc.garbage" list.
handle_legacy_finalizers(state);