From 7cb877bbc9585b51ce438c299b922ae9b72869a2 Mon Sep 17 00:00:00 2001 From: Bogdan Romanyuk Date: Tue, 4 Feb 2025 21:00:06 +0300 Subject: [PATCH 1/2] fix the race --- Objects/object.c | 8 ++++---- Tools/tsan/suppressions_free_threading.txt | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index fdff16138201a0..69fb5aac37fcd2 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2485,12 +2485,12 @@ new_reference(PyObject *op) op->ob_refcnt = 1; #endif #else - op->ob_tid = _Py_ThreadId(); + _Py_atomic_store_uintptr_relaxed(&op->ob_tid, _Py_ThreadId()); op->ob_flags = 0; op->ob_mutex = (PyMutex){ 0 }; - op->ob_gc_bits = 0; - op->ob_ref_local = 1; - op->ob_ref_shared = 0; + _Py_atomic_store_uint8_relaxed(&op->ob_gc_bits, 0); + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, 1); + _Py_atomic_store_ssize_relaxed(&op->ob_ref_shared, 0); #endif #ifdef Py_TRACE_REFS _Py_AddToAllObjects(op); diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt index e5eb665ae212de..b25b3700b35613 100644 --- a/Tools/tsan/suppressions_free_threading.txt +++ b/Tools/tsan/suppressions_free_threading.txt @@ -22,7 +22,6 @@ race:free_threadstate # These warnings trigger directly in a CPython function. race_top:assign_version_tag -race_top:new_reference race_top:_multiprocessing_SemLock_acquire_impl race_top:list_get_item_ref race_top:_Py_slot_tp_getattr_hook From d7cb09fd4761e541070e551b2439f29ece31289a Mon Sep 17 00:00:00 2001 From: Bogdan Romanyuk Date: Wed, 5 Feb 2025 12:28:48 +0300 Subject: [PATCH 2/2] use _Py_THREAD_SANITIZER macro for performance reasons --- Objects/object.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Objects/object.c b/Objects/object.c index 69fb5aac37fcd2..f3c7fa6d906ad6 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2485,12 +2485,19 @@ new_reference(PyObject *op) op->ob_refcnt = 1; #endif #else - _Py_atomic_store_uintptr_relaxed(&op->ob_tid, _Py_ThreadId()); op->ob_flags = 0; op->ob_mutex = (PyMutex){ 0 }; +#ifdef _Py_THREAD_SANITIZER + _Py_atomic_store_uintptr_relaxed(&op->ob_tid, _Py_ThreadId()); _Py_atomic_store_uint8_relaxed(&op->ob_gc_bits, 0); _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, 1); _Py_atomic_store_ssize_relaxed(&op->ob_ref_shared, 0); +#else + op->ob_tid = _Py_ThreadId(); + op->ob_gc_bits = 0; + op->ob_ref_local = 1; + op->ob_ref_shared = 0; +#endif #endif #ifdef Py_TRACE_REFS _Py_AddToAllObjects(op);