void selectorLoop(Selector* selector) { // Make sure we're not already looping. if (selector->looping) { LOG_ALWAYS_FATAL("Already looping."); } selector->looping = true; while (true) { setInSelect(selector, true); prepareForSelect(selector); LOGD("Entering select()."); // Select file descriptors. int result = select(selector->maxFd + 1, &selector->readFds, &selector->writeFds, &selector->exceptFds, NULL); LOGD("Exiting select()."); setInSelect(selector, false); if (result == -1) { // Abort on everything except EINTR. if (errno == EINTR) { LOGI("select() interrupted."); } else { LOG_ALWAYS_FATAL("select() error: %s", strerror(errno)); } } else if (result > 0) { fireEvents(selector); } } }
int selectSock(int *socks, int nr, int startTimeout) { fd_set read_set; int r; int maxFd; struct timeval tv, *tvp; if(startTimeout) { tv.tv_sec = startTimeout; tv.tv_usec = 0; tvp = &tv; } else { tvp = NULL; } maxFd = prepareForSelect(socks, nr, &read_set); r = select(maxFd+1, &read_set, NULL, NULL, tvp); if(r < 0) return r; return getSelectedSock(socks, nr, &read_set); }