https://github.com/python/cpython/commit/53e6d76aa30eb760fb8ff788815f22a0e6c101cd
commit: 53e6d76aa30eb760fb8ff788815f22a0e6c101cd
branch: main
author: T. Wouters <tho...@python.org>
committer: Yhg1s <tho...@python.org>
date: 2025-05-06T11:23:10Z
summary:

gh-132917: Fix data race detected by tsan (#133508)

Fix data race detected by tsan
(https://github.com/python/cpython/actions/runs/14857021107/job/41712717208?pr=133502):
young.count can be modified by other threads even while the gcstate is
locked.

This is the simplest fix to (potentially) unblock beta 1, although this
particular code path seems like it could just be an atomic swap followed by
an atomic add, without having the lock at all.

files:
M Python/gc_free_threading.c

diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index f1ba5de51704e1..757e9cb3227e26 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -2074,10 +2074,9 @@ gc_should_collect_mem_usage(GCState *gcstate)
         // clear the young object count so we don't check memory usage again
         // on the next call to gc_should_collect().
         PyMutex_Lock(&gcstate->mutex);
+        int young_count = _Py_atomic_exchange_int(&gcstate->young.count, 0);
         _Py_atomic_store_ssize_relaxed(&gcstate->deferred_count,
-                                       gcstate->deferred_count +
-                                           gcstate->young.count);
-        _Py_atomic_store_int(&gcstate->young.count, 0);
+                                       gcstate->deferred_count + young_count);
         PyMutex_Unlock(&gcstate->mutex);
         return false;
     }

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to