summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-06-01 14:04:38 (GMT)
committerGitHub <noreply@github.com>2024-06-01 14:04:38 (GMT)
commit90ec19fd33e2452902b9788d4821f1fbf6542304 (patch)
tree1d5d42f7a15526604b7021aa177337df06c9e8fd
parent60593b2052ca275559c11028d50e19f8e5dfee13 (diff)
downloadcpython-90ec19fd33e2452902b9788d4821f1fbf6542304.zip
cpython-90ec19fd33e2452902b9788d4821f1fbf6542304.tar.gz
cpython-90ec19fd33e2452902b9788d4821f1fbf6542304.tar.bz2
gh-117657: Fix TSAN race in QSBR assertion (#119887)
Due to a limitation in TSAN, all reads from `PyThreadState.state` must be atomic to avoid reported races.
-rw-r--r--Python/qsbr.c3
-rw-r--r--Tools/tsan/suppressions_free_threading.txt2
2 files changed, 2 insertions, 3 deletions
diff --git a/Python/qsbr.c b/Python/qsbr.c
index 9cbce90..a732115 100644
--- a/Python/qsbr.c
+++ b/Python/qsbr.c
@@ -160,7 +160,8 @@ qsbr_poll_scan(struct _qsbr_shared *shared)
bool
_Py_qsbr_poll(struct _qsbr_thread_state *qsbr, uint64_t goal)
{
- assert(_PyThreadState_GET()->state == _Py_THREAD_ATTACHED);
+ assert(_Py_atomic_load_int_relaxed(&_PyThreadState_GET()->state) == _Py_THREAD_ATTACHED);
+
if (_Py_qbsr_goal_reached(qsbr, goal)) {
return true;
}
diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt
index 951635e..9a53990 100644
--- a/Tools/tsan/suppressions_free_threading.txt
+++ b/Tools/tsan/suppressions_free_threading.txt
@@ -75,8 +75,6 @@ race_top:_PyFrame_GetCode
race_top:_PyFrame_Initialize
race_top:PyInterpreterState_ThreadHead
race_top:_PyObject_TryGetInstanceAttribute
-race_top:_Py_qsbr_unregister
-race_top:_Py_qsbr_poll
race_top:PyThreadState_Next
race_top:Py_TYPE
race_top:PyUnstable_InterpreterFrame_GetLine