Exemple #1
0
inline int mypoll(MYPOLLFD *fds, unsigned int nfds, Timeout timeout){

	fd_set readfd;
	FD_ZERO(&readfd);

	fd_set writefd;
	FD_ZERO(&writefd);

	fd_set oobfd;
	FD_ZERO(&oobfd);

	SOCKET maxfd = 0;

	for (unsigned int i = 0; i < nfds; i++) {
		if (fds[i].events & POLLIN) {
			FD_SET(fds[i].fd, &readfd);
		}

		if (fds[i].events & POLLOUT) {
			FD_SET(fds[i].fd, &writefd);
		}

		if (fds[i].events & POLLPRI) {
			FD_SET(fds[i].fd, &oobfd);
		}

		fds[i].revents = 0;
		if (fds[i].fd > maxfd) {
			maxfd = fds[i].fd;
		}
	}

	struct timeval tv;
	tv.tv_sec = timeout.getSeconds();
	tv.tv_usec = timeout.getMilliseconds() - (timeout.getSeconds() * 1000);

	int num = select(((int)(maxfd)) + 1, &readfd, &writefd, &oobfd, &tv);
	if (num < 1) {
		return num;
	}

	for (unsigned int i = 0; i < nfds; i++) {
		if (FD_ISSET(fds[i].fd, &readfd)) {
			fds[i].revents |= POLLIN;
		}

		if (FD_ISSET(fds[i].fd, &writefd)) {
			fds[i].revents |= POLLOUT;
		}

		if (FD_ISSET(fds[i].fd, &oobfd)) {
			fds[i].revents |= POLLPRI;
		}
	}

	return num;
}