gwpoll.c
来自「mms client」· C语言 代码 · 共 93 行
C
93 行
/* gwpoll.c - implement poll() for systems that don't have it */#include "gwlib/gwlib.h"#ifndef HAVE_SYS_POLL_H#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int gw_poll(struct pollfd *fdarray, unsigned int numfds, int timeout){ struct timeval tv, *tvp; unsigned int i; int maxfd; fd_set readfds, *rfdp; fd_set writefds, *wfdp; fd_set exceptfds, *xfdp; int ret; int result; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); maxfd = -1; /* These are the pointers we will pass to select(). We use them because * we may want to pass NULL for some of them. */ tvp = NULL; rfdp = NULL; wfdp = NULL; xfdp = NULL; /* Deal with timeout. We get it in milliseconds. If it's negative, * block indefinitely, which we do in select() by passing a NULL * timeval pointer. */ if (timeout >= 0) { tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; tvp = &tv; } /* Deal with fdarray, and convert it to the three fd_sets used by select. */ for (i = 0; i < numfds; i++) { int fd = fdarray[i].fd; int events = fdarray[i].events; if (fd < 0) continue; if (events & POLLIN) { FD_SET(fd, &readfds); rfdp = &readfds; } if (events & POLLOUT) { FD_SET(fd, &writefds); wfdp = &writefds; } if (events & POLLPRI) { FD_SET(fd, &exceptfds); xfdp = &exceptfds; } if (fd > maxfd && events & (POLLIN | POLLOUT | POLLPRI)) maxfd = fd; } ret = select(maxfd + 1, rfdp, wfdp, xfdp, tvp); if (ret < 0) return ret; /* Move the returned data from the fd sets to the revents fields * in fdarray. We can't detect POLLNVAL except for obviously * invalid fd's, and detecting POLLHUP or POLLERR would require * an extra read() call per fd which is too expensive. */ result = 0; for (i = 0; i < numfds; i++) { if (fdarray[i].fd < 0) { fdarray[i].revents = POLLNVAL; continue; } fdarray[i].revents = 0; if (rfdp && FD_ISSET(fdarray[i].fd, &readfds)) fdarray[i].revents |= POLLIN; if (wfdp && FD_ISSET(fdarray[i].fd, &writefds)) fdarray[i].revents |= POLLOUT; if (xfdp && FD_ISSET(fdarray[i].fd, &exceptfds)) fdarray[i].revents |= POLLPRI; if (fdarray[i].revents != 0) result++; } return result;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?