Skip to content

gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323

Merged
serhiy-storchaka merged 3 commits into
python:mainfrom
serhiy-storchaka:tkinter-wrong-thread-crash
Jun 27, 2026
Merged

gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323
serhiy-storchaka merged 3 commits into
python:mainfrom
serhiy-storchaka:tkinter-wrong-thread-crash

Conversation

@serhiy-storchaka

Copy link
Copy Markdown
Member

Dropping the last reference to a tkinter object from a thread other than the one its Tcl interpreter was created in ran Tcl_DeleteInterp() in that thread, which makes Tcl abort the whole process (Tcl_AsyncDelete: async handler deleted by the wrong thread). This typically happens when a tkinter object leaks into another thread and is garbage-collected there.

Tkapp_Dealloc() now checks the interpreter's thread and, when called in the wrong one, skips Tcl_DeleteInterp() and reports a RuntimeWarning (through the warnings machinery, so it can be filtered) instead of crashing. The interpreter is leaked, but it is small and can no longer be used once Python has dropped it.

Based on the approach in the draft PR #21532 by E. Paine.

…the wrong thread

Deallocating the interpreter from a thread other than the one it was created
in ran Tcl_DeleteInterp() there, which makes Tcl abort the process
("Tcl_AsyncDelete: async handler deleted by the wrong thread").

Tkapp_Dealloc() now leaks the interpreter in that case and reports a
RuntimeWarning instead.

Co-Authored-By: E. Paine <63801254+E-Paine@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka and others added 2 commits June 26, 2026 21:47
…ded build

On the free-threaded build the interpreter may be deallocated in its own
thread (deferred reference counting), so the RuntimeWarning is not emitted.
The no-crash guarantee is still checked by assert_python_ok().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@serhiy-storchaka serhiy-storchaka merged commit 46d1809 into python:main Jun 27, 2026
54 checks passed
@miss-islington-app

Copy link
Copy Markdown

Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14, 3.15.
🐍🍒⛏🤖

@miss-islington-app

Copy link
Copy Markdown

Sorry, @serhiy-storchaka, I could not cleanly backport this to 3.15 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker 46d1809ccd4bc0e1439a4696b428d2a1c2edcfbf 3.15

@miss-islington-app

Copy link
Copy Markdown

Sorry, @serhiy-storchaka, I could not cleanly backport this to 3.14 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker 46d1809ccd4bc0e1439a4696b428d2a1c2edcfbf 3.14

@miss-islington-app

Copy link
Copy Markdown

Sorry, @serhiy-storchaka, I could not cleanly backport this to 3.13 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker 46d1809ccd4bc0e1439a4696b428d2a1c2edcfbf 3.13

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs backport to 3.13 bugs and security fixes needs backport to 3.14 bugs and security fixes needs backport to 3.15 pre-release feature fixes, bugs and security fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant