diff options
author | Kumar Aditya <kumaraditya@python.org> | 2025-05-27 22:42:08 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-27 22:42:08 +0530 |
commit | ac539e7e0d1622c61988f30c91acfd4c06521ced (patch) | |
tree | b4050825077ff435230460f2e232e4795df0c824 /Python/gc_free_threading.c | |
parent | a380d578737be1cd51e1d1be2b83bbc0b0619e7e (diff) | |
download | cpython-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.c | 5 |
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); |