示例#1
0
/*
 * 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;
}