1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
/*
* backwards compatibility for Rubinius. See
* https://github.com/rubinius/rubinius/issues/3771.
*
* Ruby 1.9.3 provides this API which allows the use of ppoll() on Linux
* to minimize select() and malloc() overhead on high-numbered FDs.
*/
#ifdef HAVE_RB_WAIT_FOR_SINGLE_FD
# include <ruby/io.h>
#else
# define RB_WAITFD_IN 0x001
# define RB_WAITFD_PRI 0x002
# define RB_WAITFD_OUT 0x004
static int my_wait_for_single_fd(int fd, int events, struct timeval *tvp)
{
fd_set fdset;
fd_set *rfds = NULL;
fd_set *wfds = NULL;
fd_set *efds = NULL;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
if (events & RB_WAITFD_IN)
rfds = &fdset;
if (events & RB_WAITFD_OUT)
wfds = &fdset;
if (events & RB_WAITFD_PRI)
efds = &fdset;
return rb_thread_select(fd + 1, rfds, wfds, efds, tvp);
}
#define rb_wait_for_single_fd(fd,events,tvp) \
my_wait_for_single_fd((fd),(events),(tvp))
#endif
|