Mailing List Archive

gh-117657: Fix data race in `_Py_IsImmortal` (#118261)
https://github.com/python/cpython/commit/f14e9f91544b526a920724dd2b3e2d88d1e28463
commit: f14e9f91544b526a920724dd2b3e2d88d1e28463
branch: main
author: mpage <mpage@meta.com>
committer: colesbury <colesbury@gmail.com>
date: 2024-04-25T11:31:57-04:00
summary:

gh-117657: Fix data race in `_Py_IsImmortal` (#118261)

The load of `ob_ref_local races with stores. Using a relaxed load is
sufficient; stores to the field are relaxed.

files:
M Include/object.h
M Tools/tsan/suppressions_free_threading.txt

diff --git a/Include/object.h b/Include/object.h
index ffcacf1a3ef4ed..5aaf11c5194f0e 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -349,7 +349,8 @@ static inline Py_ssize_t Py_SIZE(PyObject *ob) {
static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op)
{
#if defined(Py_GIL_DISABLED)
- return (op->ob_ref_local == _Py_IMMORTAL_REFCNT_LOCAL);
+ return (_Py_atomic_load_uint32_relaxed(&op->ob_ref_local) ==
+ _Py_IMMORTAL_REFCNT_LOCAL);
#elif SIZEOF_VOID_P > 4
return (_Py_CAST(PY_INT32_T, op->ob_refcnt) < 0);
#else
diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt
index 1408103ba80f96..6ceb275925c5e1 100644
--- a/Tools/tsan/suppressions_free_threading.txt
+++ b/Tools/tsan/suppressions_free_threading.txt
@@ -14,7 +14,6 @@ race:set_allocator_unlocked
race:_add_to_weak_set
race:_in_weak_set
race:_mi_heap_delayed_free_partial
-race:_Py_IsImmortal
race:_Py_IsOwnedByCurrentThread
race:_PyEval_EvalFrameDefault
race:_PyFunction_SetVersion

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