diff --git a/CHANGELOG.md b/CHANGELOG.md index 7afbf20..1ca2d73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/lib/carbon_fiber/async.rb b/lib/carbon_fiber/async.rb index d6c0ab8..d389e9c 100644 --- a/lib/carbon_fiber/async.rb +++ b/lib/carbon_fiber/async.rb @@ -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. diff --git a/lib/carbon_fiber/scheduler.rb b/lib/carbon_fiber/scheduler.rb index 4f8e088..29d1e36 100644 --- a/lib/carbon_fiber/scheduler.rb +++ b/lib/carbon_fiber/scheduler.rb @@ -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