static int do_comm_select(int msec) { int i; int num, saved_errno; if (epoll_fds == 0) { assert(shutting_down); return COMM_SHUTDOWN; } statCounter.syscalls.polls++; num = epoll_wait(kdpfd, events, MAX_EVENTS, msec); saved_errno = errno; getCurrentTime(); debug(5, 5) ("do_comm_select: %d fds ready\n", num); if (num < 0) { if (ignoreErrno(saved_errno)) return COMM_OK; debug(5, 1) ("comm_select: epoll failure: %s\n", xstrerror()); return COMM_ERROR; } statHistCount(&statCounter.select_fds_hist, num); if (num == 0) return COMM_TIMEOUT; for (i = 0; i < num; i++) { comm_call_handlers(events[i].data.fd, events[i].events & ~EPOLLOUT, events[i].events & ~EPOLLIN); } return COMM_OK; }
static int do_comm_select(int msec) { int i; int num; int fd; struct epoll_event *cevents; if (epoll_fds == 0) { assert(shutting_down); return COMM_SHUTDOWN; } statCounter.syscalls.polls++; num = epoll_wait(kdpfd, events, MAX_EVENTS, msec); if (num < 0) { getCurrentTime(); if (ignoreErrno(errno)) return COMM_OK; debug(5, 1) ("comm_select: epoll failure: %s\n", xstrerror()); return COMM_ERROR; } statHistCount(&statCounter.select_fds_hist, num); if (num == 0) return COMM_TIMEOUT; for (i = 0, cevents = events; i < num; i++, cevents++) { fd = cevents->data.fd; comm_call_handlers(fd, cevents->events & ~EPOLLOUT, cevents->events & ~EPOLLIN); } return COMM_OK; }
static inline void do_call_incoming(int fd) { fde *F = &fd_table[fd]; if (!F->flags.backoff) comm_call_handlers(fd, -1, -1); }
static int do_comm_select(int msec) { int num, saved_errno; struct timeval tv; fd_set readfds; fd_set writefds; fd_set errfds; int fd; if (nreadfds + nwritefds == 0) { assert(shutting_down); return COMM_SHUTDOWN; } memcpy(&readfds, &global_readfds, sizeof(fd_set)); memcpy(&writefds, &global_writefds, sizeof(fd_set)); memcpy(&errfds, &global_writefds, sizeof(fd_set)); tv.tv_sec = msec / 1000; tv.tv_usec = (msec % 1000) * 1000; statCounter.syscalls.selects++; num = select(Biggest_FD + 1, &readfds, &writefds, &errfds, &tv); saved_errno = errno; getCurrentTime(); debug(5, 5) ("do_comm_select: %d fds ready\n", num); if (num < 0) { if (ignoreErrno(saved_errno)) return COMM_OK; debug(5, 1) ("comm_select: select failure: %s\n", xstrerror()); return COMM_ERROR; } statHistCount(&statCounter.select_fds_hist, num); if (num == 0) return COMM_TIMEOUT; for (fd = 0; fd <= Biggest_FD; fd++) { int read_event = FD_ISSET(fd, &readfds); int write_event = FD_ISSET(fd, &writefds) || FD_ISSET(fd, &errfds); if (read_event || write_event) comm_call_handlers(fd, read_event, write_event); } return COMM_OK; }
static int do_comm_select(int msec) { int num; int i; if (nfds == 0) { assert(shutting_down); return COMM_SHUTDOWN; } statCounter.syscalls.selects++; num = poll(pfds, nfds, msec); if (num < 0) { getCurrentTime(); if (ignoreErrno(errno)) return COMM_OK; debug(5, 1) ("comm_select: poll failure: %s\n", xstrerror()); return COMM_ERROR; } statHistCount(&statCounter.select_fds_hist, num); if (num == 0) return COMM_TIMEOUT; for (i = nfds - 1; num > 0 && i >= 0; i--) { struct pollfd *pfd = &pfds[i]; short read_event, write_event; if (!pfd->revents) continue; read_event = pfd->revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR); write_event = pfd->revents & (POLLWRNORM | POLLOUT | POLLHUP | POLLERR); pfd->revents = 0; comm_call_handlers(pfd->fd, read_event, write_event); num--; } return COMM_OK; }