-
-
Notifications
You must be signed in to change notification settings - Fork 32.7k
GH-125603: Don't count executing generators and coroutines as referrers in gc.gc_referrers. #125640
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
markshannon
wants to merge
6
commits into
python:main
Choose a base branch
from
faster-cpython:hide-executing-generator-refs
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
01bf540
Don't count executing generators and coroutines as referrers in gc.ge…
markshannon 9673b8a
Mark generators left on stack when clearing frame as zombies.
markshannon daa080f
Merge branch 'main' into hide-executing-generator-refs
markshannon 3ba315f
Add missing includes
markshannon 6b34f05
Update test
markshannon a59fa5e
Keep ruff happy
markshannon File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
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
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's not sufficient to mark generators as zombies in
PyThreadState_Clear()
. We callPyThreadState_Clear()
one at a time on each non-main thread:PyThreadStates
PyThreadState_Clear()
calls makes escaping calls (Py_CLEAR()
) that can trigger the GCSo the GC may still see generators that are marked as "running", but aren't in any accessible
PyThreadState
's frame stack.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wrote "At that point, they are already unlinked from the interpreter's list of PyThreadStates", but I don't think that's accurate. Thread states are unlinked in
PyThreadState_Delete
orPyThreadState_DeleteCurrent
, and those happen afterPyThreadState_Clear
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh... my Oct 22, 2024 comment was in relation to interpreter shutdown, which reverses the typical order. During shutdown thread states are:
Whereas during normal thread exit the order is:
Specifically, in
_Py_Finalize()
we:cpython/Python/pylifecycle.c
Line 2079 in 1150321
_PyThreadState_DeleteList()
, which callsPyThreadState_Clear()
on each thread one at a time, which can execute arbitrary code via finalizers and weakrefs.cpython/Python/pylifecycle.c
Line 2090 in 1150321
cpython/Python/pystate.c
Lines 1904 to 1922 in 1150321
I think things should be okay if we mark the generators as zombies from
_PyThreadState_RemoveExcept()
as well as fromPyThreadState_Clear()
.