Allow IO#close
to interrupt IO operations on fibers using fiber_interrupt
hook.
#12839
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.
Ruby's
IO#close
can causeIO#read
,IO#write
,IO#wait
,IO#wait_readable
andIO#wait_writable
to be interrupted with an IOError (stream closed on another thread).The fiber scheduler did not implement this for
io_read
,io_write
andio_wait
hooks. Finally after several years, someone made a bug report - see socketry/async#368 for background. In order to solve this problem for the fiber scheduler, we need to expose the ability forIO#close
to interrupt a fiber.This PR introduces a new internal C function
rb_thread_io_interruptible_operation
which takes an IO instance and a callback. During that callback, if the IO is closed, the callback will be interrupted.It also introduces a new fiber scheduler method,
fiber_interrupt
which allows us to interrupt a specific fiber with an error, in this case with anIOError
.https://bugs.ruby-lang.org/issues/21166