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

Fix data race detected by tsan
(4171271720):
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.
This commit is contained in:
T. Wouters 2025-05-06 13:23:10 +02:00 committed by GitHub
parent 296cd128bf
commit 53e6d76aa3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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;
}