From 53dbac948575b07e95d184bbfbe4d8953c5ccc4c Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 2 Mar 2004 16:58:49 +0000 Subject: Tweaks for the Macintosh. --- src/libthread/fdwait.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 5 deletions(-) (limited to 'src/libthread') diff --git a/src/libthread/fdwait.c b/src/libthread/fdwait.c index 2f8581f1..170305eb 100644 --- a/src/libthread/fdwait.c +++ b/src/libthread/fdwait.c @@ -4,10 +4,87 @@ #include #include -#include #include #include +#define debugpoll 0 + +#ifdef __APPLE__ +#include +enum { POLLIN=1, POLLOUT=2, POLLERR=4 }; +struct pollfd +{ + int fd; + int events; + int revents; +}; + +int +poll(struct pollfd *p, int np, int ms) +{ + int i, maxfd, n; + struct timeval tv, *tvp; + fd_set rfd, wfd, efd; + + maxfd = -1; + FD_ZERO(&rfd); + FD_ZERO(&wfd); + FD_ZERO(&efd); + for(i=0; i maxfd) + maxfd = p[i].fd; + if(p[i].events & POLLIN) + FD_SET(p[i].fd, &rfd); + if(p[i].events & POLLOUT) + FD_SET(p[i].fd, &wfd); + FD_SET(p[i].fd, &efd); + } + + if(ms != -1){ + tv.tv_usec = (ms%1000)*1000; + tv.tv_sec = ms/1000; + tvp = &tv; + }else + tvp = nil; + + if(debugpoll){ + fprint(2, "select %d:", maxfd+1); + for(i=0; i<=maxfd; i++){ + if(FD_ISSET(i, &rfd)) + fprint(2, " r%d", i); + if(FD_ISSET(i, &wfd)) + fprint(2, " w%d", i); + if(FD_ISSET(i, &efd)) + fprint(2, " e%d", i); + } + fprint(2, "; tp=%p, t=%d.%d\n", tvp, tv.tv_sec, tv.tv_usec); + } + + n = select(maxfd+1, &rfd, &wfd, &efd, tvp); + + if(n <= 0) + return n; + + for(i=0; i +#endif + /* * Poll file descriptors in an idle loop. */ @@ -34,21 +111,22 @@ pollidle(void *v) uint now; for(;; yield()){ - //fprint(2, "poll %d:", npoll); + if(debugpoll) fprint(2, "poll %d:", npoll); for(i=0; i