gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323
Open
serhiy-storchaka wants to merge 2 commits into
Open
gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323serhiy-storchaka wants to merge 2 commits into
serhiy-storchaka wants to merge 2 commits into
Conversation
…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>
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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, skipsTcl_DeleteInterp()and reports aRuntimeWarning(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.