Fix GH-19983: GC assertion failure with fibers, generators and destructors#21529
Closed
iliaal wants to merge 1 commit intophp:PHP-8.4from
Closed
Fix GH-19983: GC assertion failure with fibers, generators and destructors#21529iliaal wants to merge 1 commit intophp:PHP-8.4from
iliaal wants to merge 1 commit intophp:PHP-8.4from
Conversation
…tructors When GC runs inside a fiber handling an exception (e.g. during zend_fiber_object_destroy), EG(exception) is set. gc_call_destructors_in_fiber() saved and cleared the exception after creating the destructor fiber. Since zend_call_function() returns early when EG(exception) is set, the destructor fiber's handler never ran, leaving DTOR_GARBAGE entries in the root buffer. On the next GC cycle, gc_collect_roots() hit an alignment assertion on these stale entries. Move remember_prev_exception() before the destructor fiber creation/resume so EG(exception) is cleared before zend_call_function() runs inside the fiber. Closes phpGH-19983
Contributor
Author
|
@arnaud-lb Rebase kinda went nuts, so rather then figuring it out closed old PR and made a new one... |
Member
|
Thank you! |
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.
When GC runs inside a fiber handling an exception (e.g. during
zend_fiber_object_destroy),EG(exception)is set.gc_call_destructors_in_fiber()saved and cleared the exception after creating the destructor fiber. Sincezend_call_function()returns early whenEG(exception)is set, the destructor fiber's handler never ran, leavingDTOR_GARBAGEentries in the root buffer. On the next GC cycle,gc_collect_roots()hit an alignment assertion on these stale entries.Move
remember_prev_exception()before the destructor fiber creation/resume soEG(exception)is cleared beforezend_call_function()runs inside the fiber.Fixes #19983