From 4720897fe42109e1a326dacd5c0dbf10703eff23 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 23 Dec 2025 19:22:59 -0500 Subject: [PATCH] gh-120321: Fix TSan reported races on gi_frame_state --- Objects/genobject.c | 2 +- Python/frame.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c index 020af903a3f828..d1fcda3d608320 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -559,7 +559,7 @@ gen_set_exception(PyObject *typ, PyObject *val, PyObject *tb) static PyObject * gen_throw_current_exception(PyGenObject *gen) { - assert(gen->gi_frame_state == FRAME_EXECUTING); + assert(FT_ATOMIC_LOAD_INT8_RELAXED(gen->gi_frame_state) == FRAME_EXECUTING); PyObject *result; if (gen_send_ex2(gen, Py_None, &result, 1) == PYGEN_RETURN) { diff --git a/Python/frame.c b/Python/frame.c index ce216797e47cda..da8f9037e8287a 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -109,7 +109,7 @@ _PyFrame_ClearExceptCode(_PyInterpreterFrame *frame) /* It is the responsibility of the owning generator/coroutine * to have cleared the enclosing generator, if any. */ assert(frame->owner != FRAME_OWNED_BY_GENERATOR || - _PyGen_GetGeneratorFromFrame(frame)->gi_frame_state == FRAME_CLEARED); + FT_ATOMIC_LOAD_INT8_RELAXED(_PyGen_GetGeneratorFromFrame(frame)->gi_frame_state) == FRAME_CLEARED); // GH-99729: Clearing this frame can expose the stack (via finalizers). It's // crucial that this frame has been unlinked, and is no longer visible: assert(_PyThreadState_GET()->current_frame != frame);