[ruby-core:35527] using poll() for rb_io_wait_{read,writ}able()?

2 views
Skip to first unread message

Eric Wong

unread,
Mar 19, 2011, 11:23:03 PM3/19/11
to ruby...@ruby-lang.org
Hello, on some OSes it should be easy to swap out some current
users of select() for poll(). poll() works better on high-numbered
file descriptors.

I'm not sure how well poll() works for certain FD types (FIFO/anonymous
pipes/various socket types), but I know poll() on Linux works for
everything I've tried, so I might just enable it only under Linux until
other people can test it on other systems.

1. rb_io_wait_readable() + rb_io_wait_writable()
2. IO#wait
3. IO.select with a single object (common in my experience)

rb_thread_select() will probably always be around for backwards
compatibility.

IO.select for multiple IO objects might just be kept as-is for now.
IO.select seems to properly map multiple IO objects using the same FD
properly, which requires extra work and might not be worth it.

I can provide patches and try my best to not break compatibility
with other systems if folks are interested.

Thanks for reading!

--
Eric Wong

Evan Phoenix

unread,
Mar 20, 2011, 2:57:54 AM3/20/11
to ruby...@ruby-lang.org

On Mar 19, 2011, at 8:23 PM, Eric Wong wrote:

> Hello, on some OSes it should be easy to swap out some current
> users of select() for poll(). poll() works better on high-numbered
> file descriptors.
>
> I'm not sure how well poll() works for certain FD types (FIFO/anonymous
> pipes/various socket types), but I know poll() on Linux works for
> everything I've tried, so I might just enable it only under Linux until
> other people can test it on other systems.

For a long time (and maybe still) poll(2) on OS X did not work on fd's for ttys. This is/was because poll(2) was implemented with kqueue(2), which did not support tty fd's.

I attempted to work around the situation once by detecting if the fd was for a tty and using select(2) instead, but in the end it was more hassle than it was worth.

Oh, as I type this, I recall on OS X poll(2) also didn't support fd's for pipes. Same reason as above, kqueue didn't support them.

- Evan


Reply all
Reply to author
Forward
0 new messages