Feature #16597 » 0009-rb_fd_select-raise-exception-on-bad-fd-when-using-po.patch
| thread.c | ||
|---|---|---|
|
rb_fd_set(pollfdset->fds[i].fd, fds);
|
||
|
}
|
||
|
static bool
|
||
|
pollfdset_badfd(struct rb_pollfdset *pollfdset)
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < pollfdset->n_fds; i++)
|
||
|
if (pollfdset->fds[i].revents & POLLNVAL)
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
int
|
||
|
rb_fd_select(int n, rb_fdset_t *readfds, rb_fdset_t *writefds, rb_fdset_t *exceptfds, rb_fdset_t *errorfds, struct timeval *timeout)
|
||
|
{
|
||
|
struct rb_pollfdset pollfdset;
|
||
|
int timeout_ms = timeout ? timeout->tv_sec * 1000 + timeout->tv_usec / 1000 : -1;
|
||
|
bool badfd;
|
||
|
int ret;
|
||
|
pollfdset_init(&pollfdset);
|
||
| ... | ... | |
|
if (exceptfds) pollfdset_add(&pollfdset, exceptfds, POLLEX_SET);
|
||
|
if (errorfds) pollfdset_add(&pollfdset, errorfds, POLLERR_SET);
|
||
|
ret = poll(pollfdset.fds, pollfdset.n_fds, timeout_ms);
|
||
|
if (readfds) pollfdset_extract(&pollfdset, readfds, POLLIN_SET);
|
||
|
if (writefds) pollfdset_extract(&pollfdset, writefds, POLLOUT_SET);
|
||
|
if (exceptfds) pollfdset_extract(&pollfdset, exceptfds, POLLEX_SET);
|
||
|
if (errorfds) pollfdset_extract(&pollfdset, errorfds, POLLERR_SET);
|
||
|
badfd = pollfdset_badfd(&pollfdset);
|
||
|
if (badfd) {
|
||
|
if (readfds) rb_fd_zero(readfds);
|
||
|
if (writefds) rb_fd_zero(writefds);
|
||
|
if (exceptfds) rb_fd_zero(exceptfds);
|
||
|
if (errorfds) rb_fd_zero(errorfds);
|
||
|
} else {
|
||
|
if (readfds) pollfdset_extract(&pollfdset, readfds, POLLIN_SET);
|
||
|
if (writefds) pollfdset_extract(&pollfdset, writefds, POLLOUT_SET);
|
||
|
if (exceptfds) pollfdset_extract(&pollfdset, exceptfds, POLLEX_SET);
|
||
|
if (errorfds) pollfdset_extract(&pollfdset, errorfds, POLLERR_SET);
|
||
|
}
|
||
|
pollfdset_term(&pollfdset);
|
||
|
if (badfd) {
|
||
|
errno = EBADF;
|
||
|
return -EBADF;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
#else /* USE_POLL */
|
||