Skip to content

Commit 0c16934

Browse files
Use IO::Buffer feature detection for selector fallback
Assisted-By: devx/242ffd92-f36a-421a-88b9-270e5488162a
1 parent 2f3f842 commit 0c16934

1 file changed

Lines changed: 39 additions & 23 deletions

File tree

lib/io/event/selector/select.rb

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -265,37 +265,53 @@ def io_write(fiber, io, buffer, length, offset = 0)
265265
return total
266266
end
267267

268-
private def buffer_read(io, buffer, offset)
269-
if RUBY_ENGINE == "jruby"
268+
unless IO::Buffer.method_defined?(:read) and IO::Buffer.method_defined?(:write)
269+
private def buffer_read(io, buffer, offset)
270270
string = io.read_nonblock(buffer.size - offset)
271271
buffer.set_string(string, offset)
272272
return string.bytesize
273-
else
274-
Fiber.blocking{buffer.read(io, 0, offset)}
273+
rescue EOFError
274+
return 0
275+
rescue IOError
276+
return -Errno::EBADF::Errno
277+
rescue IO::WaitReadable
278+
return EAGAIN
279+
rescue SystemCallError => error
280+
return -error.errno
275281
end
276-
rescue EOFError
277-
return 0
278-
rescue IOError
279-
return -Errno::EBADF::Errno
280-
rescue IO::WaitReadable
281-
return EAGAIN
282-
rescue SystemCallError => error
283-
return -error.errno
284-
end
285-
286-
private def buffer_write(io, buffer, offset)
287-
if RUBY_ENGINE == "jruby"
282+
283+
private def buffer_write(io, buffer, offset)
288284
string = buffer.get_string(offset, buffer.size - offset)
289285
return io.write_nonblock(string)
290-
else
286+
rescue IO::WaitWritable
287+
return EAGAIN
288+
rescue IOError
289+
return -Errno::EBADF::Errno
290+
rescue SystemCallError => error
291+
return -error.errno
292+
end
293+
else
294+
private def buffer_read(io, buffer, offset)
295+
Fiber.blocking{buffer.read(io, 0, offset)}
296+
rescue EOFError
297+
return 0
298+
rescue IOError
299+
return -Errno::EBADF::Errno
300+
rescue IO::WaitReadable
301+
return EAGAIN
302+
rescue SystemCallError => error
303+
return -error.errno
304+
end
305+
306+
private def buffer_write(io, buffer, offset)
291307
Fiber.blocking{buffer.write(io, 0, offset)}
308+
rescue IO::WaitWritable
309+
return EAGAIN
310+
rescue IOError
311+
return -Errno::EBADF::Errno
312+
rescue SystemCallError => error
313+
return -error.errno
292314
end
293-
rescue IO::WaitWritable
294-
return EAGAIN
295-
rescue IOError
296-
return -Errno::EBADF::Errno
297-
rescue SystemCallError => error
298-
return -error.errno
299315
end
300316

301317
# Wait for a process to change state.

0 commit comments

Comments
 (0)