From cd8c6333df4d302d91f760d4f5b524acc69ce36f Mon Sep 17 00:00:00 2001 From: tangyuan0821 Date: Mon, 13 Jul 2026 10:34:12 +0800 Subject: [PATCH 1/2] gh-153020: Fix race condition on event_tstate in _tkinter --- Modules/_tkinter.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index f5fb1841f0d5940..2fbafba27435c1f 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -3655,7 +3655,7 @@ EventHook(void) int tfile; stdin_ready = 0; #endif - PyEval_RestoreThread(event_tstate); + PyEval_RestoreThread(_Py_atomic_load_ptr(&event_tstate)); errorInCmd = 0; #ifdef MS_WINDOWS hStdin = GetStdHandle(STD_INPUT_HANDLE); @@ -3687,7 +3687,7 @@ EventHook(void) #endif Py_BEGIN_ALLOW_THREADS if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); - tcl_tstate = event_tstate; + tcl_tstate = _Py_atomic_load_ptr(&event_tstate); result = Tcl_DoOneEvent(TCL_DONT_WAIT); @@ -3725,7 +3725,7 @@ EnableEventHook(void) { #ifdef WAIT_FOR_STDIN if (PyOS_InputHook == NULL) { - event_tstate = PyThreadState_Get(); + _Py_atomic_store_ptr(&event_tstate, PyThreadState_Get()); PyOS_InputHook = EventHook; } #endif @@ -3737,6 +3737,7 @@ DisableEventHook(void) #ifdef WAIT_FOR_STDIN if (Tk_GetNumMainWindows() == 0 && PyOS_InputHook == EventHook) { PyOS_InputHook = NULL; + _Py_atomic_store_ptr(&event_tstate, NULL); } #endif } From 6e7c0ef270ef269d88063b176072ef312b4bfea8 Mon Sep 17 00:00:00 2001 From: tangyuan0821 Date: Mon, 13 Jul 2026 10:38:54 +0800 Subject: [PATCH 2/2] gh-153020: Add NEWS entry for _tkinter data race fix --- .../Library/2026-07-13-10-37-32.gh-issue-153020.eventTs.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-07-13-10-37-32.gh-issue-153020.eventTs.rst diff --git a/Misc/NEWS.d/next/Library/2026-07-13-10-37-32.gh-issue-153020.eventTs.rst b/Misc/NEWS.d/next/Library/2026-07-13-10-37-32.gh-issue-153020.eventTs.rst new file mode 100644 index 000000000000000..1dd8485ade46201 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-07-13-10-37-32.gh-issue-153020.eventTs.rst @@ -0,0 +1,2 @@ +Fix a data race in :mod:`!_tkinter` input event handling in free-threaded +builds.