Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## [Unreleased]

- `Scheduler#io_close` and `Async::Selector#io_close` now take a file descriptor (Integer), matching Ruby's Fiber::Scheduler protocol. (Thanks to [Samuel Williams](https://github.com/samuel-williams-shopify)).

## [0.1.3] - 2026-05-08

- Update to Zig 0.16.0; update libxev and zig.rb to the latest versions.
Expand Down
9 changes: 4 additions & 5 deletions lib/carbon_fiber/async.rb
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,10 @@ def io_write(fiber, io, buffer, length, offset = 0)
ruby_io_write(fiber, io, buffer, length, offset)
end

# Cancel pending waiters and close the descriptor.
# @param io [IO]
def io_close(io)
fd = io.respond_to?(:fileno) ? io.fileno : io.to_i
super(fd, IOError.new("stream closed while waiting"))
# Cancel pending waiters on the descriptor.
# @param descriptor [Integer]
def io_close(descriptor)
super(descriptor, IOError.new("stream closed while waiting"))
end

# Wait for a child process on a background thread.
Expand Down
11 changes: 5 additions & 6 deletions lib/carbon_fiber/scheduler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -238,15 +238,14 @@ def io_select(...)
end
end

# Cancel pending waiters on an IO and close the descriptor.
# @param io [IO]
def io_close(io)
descriptor = io.respond_to?(:to_i) ? io.to_i : io
# Cancel pending waiters on a descriptor and close it.
# @param descriptor [Integer]
def io_close(descriptor)
@selector.io_close(descriptor, IOError.new("stream closed while waiting"))

Fiber.blocking do
target = io.is_a?(IO) ? io : IO.for_fd(descriptor.to_i)
target.close unless target.closed?
io = IO.for_fd(descriptor)
io.close unless io.closed?
end

true
Expand Down
Loading