/* * call-seq: * * Kgio.poll({ $stdin => :wait_readable }, 100) -> hash or nil * Kgio.poll({ $stdin => Kgio::POLLIN }, 100) -> hash or nil * * Accepts an input hash with IO objects to wait for as the key and * the events to wait for as its value. The events may either be * +:wait_readable+ or +:wait_writable+ symbols or a Fixnum mask of * Kgio::POLL* constants: * * Kgio::POLLIN - there is data to read * Kgio::POLLPRI - there is urgent data to read * Kgio::POLLOUT - writing will not block * Kgio::POLLRDHUP - peer has shutdown writes (Linux 2.6.17+ only) * * Timeout is specified in Integer milliseconds just like the underlying * poll(2), not in seconds like IO.select. A nil timeout means to wait * forever. It must be an Integer or nil. * * Kgio.poll modifies and returns its input hash on success with the * IO-like object as the key and an Integer mask of events as the hash * value. It can return any of the events specified in the input * above, along with the following events: * * Kgio::POLLERR - error condition occurred on the descriptor * Kgio::POLLHUP - hang up * Kgio::POLLNVAL - invalid request (bad file descriptor) * * This method is only available under Ruby 1.9 or any other * implementations that uses native threads and rb_thread_blocking_region() */ static VALUE s_poll(int argc, VALUE *argv, VALUE self) { VALUE timeout; struct poll_args a; rb_scan_args(argc, argv, "11", &a.ios, &timeout); a.timeout = num2timeout(timeout); a.fds = NULL; a.fd_to_io = NULL; return rb_ensure(do_poll, (VALUE)&a, poll_free, (VALUE)&a); }