Due to a limitation in TSAN, all reads from `PyThreadState.state` must be
atomic to avoid reported races.
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;
}
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