Object
# File io/wait/lib/nonblock.rb, line 17 def nonblock(nb = true) nb, self.nonblock = nonblock?, nb yield ensure self.nonblock = nb end
# File io/wait/lib/nonblock.rb, line 7 def nonblock=(nb) f = fcntl(Fcntl::F_GETFL) if nb f |= File::NONBLOCK else f &= ~File::NONBLOCK end fcntl(Fcntl::F_SETFL, f) end
# File io/wait/lib/nonblock.rb, line 3 def nonblock? (fcntl(Fcntl::F_GETFL) & File::NONBLOCK) != 0 end
Returns non-nil if input available without blocking, or nil.
static VALUE io_ready_p(VALUE io) { rb_io_t *fptr; ioctl_arg n; GetOpenFile(io, fptr); rb_io_check_readable(fptr); if (rb_io_read_pending(fptr)) return Qtrue; if (!FIONREAD_POSSIBLE_P(fptr->fd)) return Qfalse; if (ioctl(fptr->fd, FIONREAD, &n)) rb_sys_fail(0); if (n > 0) return ioctl_arg2num(n); return Qnil; }
Waits until input is available or times out and returns self or nil when EOF is reached.
static VALUE io_wait(int argc, VALUE *argv, VALUE io) { rb_io_t *fptr; struct wait_readable_arg arg; int fd, i; ioctl_arg n; VALUE timeout; struct timeval timerec; GetOpenFile(io, fptr); rb_io_check_readable(fptr); rb_scan_args(argc, argv, "01", &timeout); if (NIL_P(timeout)) { arg.timeout = 0; } else { timerec = rb_time_interval(timeout); arg.timeout = &timerec; } if (rb_io_read_pending(fptr)) return Qtrue; if (!FIONREAD_POSSIBLE_P(fptr->fd)) return Qfalse; fd = fptr->fd; rb_fd_init(&arg.fds); rb_fd_set(fd, &arg.fds); #ifdef HAVE_RB_FD_INIT i = (int)rb_ensure(wait_readable, (VALUE)&arg, (VALUE (*)_((VALUE)))rb_fd_term, (VALUE)&arg.fds); #else i = rb_thread_select(fd + 1, rb_fd_ptr(&arg.fds), NULL, NULL, arg.timeout); #endif if (i < 0) rb_sys_fail(0); rb_io_check_closed(fptr); if (ioctl(fptr->fd, FIONREAD, &n)) rb_sys_fail(0); if (n > 0) return io; return Qnil; }