/* * Under win32, it seems that fd is not allocated continously. * Sorry for windows guys:'( */ bool SocketRegistryImpl::poll(time_t now) { FdSet fdset; int fds[FD_SIZE]; int nfds = 0; FD_ENTRY *e; // Set in the fd_set from 0 to maxfd for (e = fdTable + maxfd; e >= fdTable; e--) { if (e->fd < 0) continue; // Check timeout if (e->timeout && e->timeout <= now) { // Reset timer e->timeout = 0; e->listener->onSocketTimeout(); } else if (e->event) { fdset.setFd(e->fd, e->event); fds[nfds++] = e->fd; } } int n = fdset.poll(); if (n < 0) return false; // Returns if no sockets event if (n == 0) return true; // Dispatch socket events for (int i = 0; i < nfds; i++) { int events = fdset.getEventsReady(i, fds[i]); e = fdTable + fds[i]; if (events & SOCKET_READ) { // Do not poll on this fd any more if an error occurs if (!e->listener->onSocketRead()) { e->event = 0; continue; } } if (events & SOCKET_WRITE) { // We remove write event mask here. clients may add it again // in onSocketWrite() removeEvent(e->fd, SOCKET_WRITE); e->timeout = 0; e->listener->onSocketWrite(); } } return true; }