gwpoll.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /* gwpoll.c - implement poll() for systems that don't have it */
  2. #include "gwlib/gwlib.h"
  3. #ifndef HAVE_SYS_POLL_H
  4. #include <sys/time.h>
  5. #include <sys/types.h>
  6. #include <unistd.h>
  7. int gw_poll(struct pollfd *fdarray, unsigned int numfds, int timeout)
  8. {
  9.     struct timeval tv, *tvp;
  10.     unsigned int i;
  11.     int maxfd;
  12.     fd_set readfds, *rfdp;
  13.     fd_set writefds, *wfdp;
  14.     fd_set exceptfds, *xfdp;
  15.     int ret;
  16.     int result;
  17.     FD_ZERO(&readfds);
  18.     FD_ZERO(&writefds);
  19.     FD_ZERO(&exceptfds);
  20.     maxfd = -1;
  21.     /* These are the pointers we will pass to select().  We use them because
  22.      * we may want to pass NULL for some of them. */
  23.     tvp = NULL;
  24.     rfdp = NULL;
  25.     wfdp = NULL;
  26.     xfdp = NULL;
  27.     /* Deal with timeout.  We get it in milliseconds.  If it's negative,
  28.      * block indefinitely, which we do in select() by passing a NULL
  29.      * timeval pointer. */
  30.     if (timeout >= 0) {
  31.         tv.tv_sec = timeout / 1000;
  32.         tv.tv_usec = (timeout % 1000) * 1000;
  33.         tvp = &tv;
  34.     }
  35.     /* Deal with fdarray, and convert it to the three fd_sets used by select. */
  36.     for (i = 0; i < numfds; i++) {
  37.         int fd = fdarray[i].fd;
  38.         int events = fdarray[i].events;
  39.         if (fd < 0)
  40.             continue;
  41.         if (events & POLLIN) {
  42.             FD_SET(fd, &readfds);
  43.             rfdp = &readfds;
  44. }
  45.         if (events & POLLOUT) {
  46.             FD_SET(fd, &writefds);
  47.             wfdp = &writefds;
  48. }
  49.         if (events & POLLPRI) {
  50.             FD_SET(fd, &exceptfds);
  51.             xfdp = &exceptfds;
  52. }
  53.         if (fd > maxfd && events & (POLLIN | POLLOUT | POLLPRI))
  54.     maxfd = fd;
  55.     }
  56.     ret = select(maxfd + 1, rfdp, wfdp, xfdp, tvp);
  57.     if (ret < 0)
  58.         return ret;
  59.     /* Move the returned data from the fd sets to the revents fields
  60.      * in fdarray.  We can't detect POLLNVAL except for obviously
  61.      * invalid fd's, and detecting POLLHUP or POLLERR would require
  62.      * an extra read() call per fd which is too expensive. */
  63.     result = 0;
  64.     for (i = 0; i < numfds; i++) {
  65.         if (fdarray[i].fd < 0) {
  66.     fdarray[i].revents = POLLNVAL;
  67.             continue;
  68.         }
  69.         fdarray[i].revents = 0;
  70.         if (rfdp && FD_ISSET(fdarray[i].fd, &readfds))
  71.     fdarray[i].revents |= POLLIN;
  72.         if (wfdp && FD_ISSET(fdarray[i].fd, &writefds))
  73.     fdarray[i].revents |= POLLOUT;
  74.         if (xfdp && FD_ISSET(fdarray[i].fd, &exceptfds))
  75.     fdarray[i].revents |= POLLPRI;
  76. if (fdarray[i].revents != 0)
  77.     result++;
  78.     }
  79.     return result;
  80. }
  81. #endif