static int native_fd_select(int n, rb_fdset_t *readfds, rb_fdset_t *writefds, rb_fdset_t *exceptfds, struct timeval *timeout, rb_thread_t *th) { fd_set *r = NULL, *w = NULL, *e = NULL; if (readfds) { rb_fd_resize(n - 1, readfds); r = rb_fd_ptr(readfds); } if (writefds) { rb_fd_resize(n - 1, writefds); w = rb_fd_ptr(writefds); } if (exceptfds) { rb_fd_resize(n - 1, exceptfds); e = rb_fd_ptr(exceptfds); } return rb_w32_select_with_thread(n, r, w, e, timeout, th); }
int rb_fd_select(int n, rb_fdset_t *readfds, rb_fdset_t *writefds, rb_fdset_t *exceptfds, struct timeval *timeout) { fd_set *r = NULL, *w = NULL, *e = NULL; if (readfds) { rb_fd_resize(n - 1, readfds); r = rb_fd_ptr(readfds); } if (writefds) { rb_fd_resize(n - 1, writefds); w = rb_fd_ptr(writefds); } if (exceptfds) { rb_fd_resize(n - 1, exceptfds); e = rb_fd_ptr(exceptfds); } return select(n, r, w, e, timeout); }
static void rb_thread_wait_fd_rw(int fd, int read) { int result = 0; while (result <= 0) { rb_fdset_t *set = ALLOC(rb_fdset_t); rb_fd_init(set); FD_SET(fd, set); if (read) { result = do_select(fd + 1, rb_fd_ptr(set), 0, 0, 0); } else { result = do_select(fd + 1, 0, rb_fd_ptr(set), 0, 0); } rb_fd_term(set); if (result < 0) { rb_sys_fail(0); } } }