-#ifdef IO_USE_SELECT
-static int
-io_dispatch_select(struct timeval *tv)
-{
- fd_set readers_tmp = readers;
- fd_set writers_tmp = writers;
- short what;
- int ret, i;
- int fds_ready;
- ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
- if (ret <= 0)
- return ret;
-
- fds_ready = ret;
-
- for (i = 0; i <= select_maxfd; i++) {
- what = 0;
- if (FD_ISSET(i, &readers_tmp)) {
- what = IO_WANTREAD;
- fds_ready--;
- }
-
- if (FD_ISSET(i, &writers_tmp)) {
- what |= IO_WANTWRITE;
- fds_ready--;
- }
- if (what)
- io_docallback(i, what);
- if (fds_ready <= 0)
- break;
- }
-
- return ret;
-}
-#endif
-
-
-#ifdef IO_USE_EPOLL
-static int
-io_dispatch_epoll(struct timeval *tv)
-{
- time_t sec = tv->tv_sec * 1000;
- int i, total = 0, ret, timeout = tv->tv_usec + sec;
- struct epoll_event epoll_ev[100];
- short type;
-
- if (timeout < 0)
- timeout = 1000;
-
- do {
- ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
- total += ret;
- if (ret <= 0)
- return total;
-
- for (i = 0; i < ret; i++) {
- type = 0;
- if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
- type = IO_ERROR;
-
- if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
- type |= IO_WANTREAD;
-
- if (epoll_ev[i].events & EPOLLOUT)
- type |= IO_WANTWRITE;
-
- io_docallback(epoll_ev[i].data.fd, type);
- }
-
- timeout = 0;
- } while (ret == 100);
-
- return total;
-}
-#endif
-
-
-#ifdef IO_USE_KQUEUE
-static int
-io_dispatch_kqueue(struct timeval *tv)
-{
- int i, total = 0, ret;
- struct kevent kev[100];
- struct kevents *newevents;
- struct timespec ts;
- int newevents_len;
- short type;
- ts.tv_sec = tv->tv_sec;
- ts.tv_nsec = tv->tv_usec * 1000;
-
- do {
- newevents_len = array_length(&io_evcache, sizeof (struct kevent));
- newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
- assert(newevents_len >= 0);
- if (newevents_len < 0)
- newevents_len = 0;
-#ifdef DEBUG
- if (newevents_len)
- assert(newevents);
-#endif
-
- ret = kevent(io_masterfd, newevents, newevents_len, kev,
- 100, &ts);
- if ((newevents_len>0) && ret != -1)
- array_trunc(&io_evcache);
-
- total += ret;
- if (ret <= 0)
- return total;
-
- for (i = 0; i < ret; i++) {
- type = 0;
- if (kev[i].flags & EV_EOF)
- type = IO_ERROR;
-
- if (kev[i].filter & EV_ERROR)
- type = IO_ERROR;
-
- if (kev[i].filter & EVFILT_READ)
- type |= IO_WANTREAD;
-
- if (kev[i].filter & EVFILT_WRITE)
- type |= IO_WANTWRITE;
-
- io_docallback(kev[i].ident, type);
- }
-
- ts.tv_sec = 0;
- ts.tv_nsec = 0;
-
- } while (ret == 100);
-
- return total;
-}
-#endif
-
-