X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=src%2Flib%2Flwp%2Fsel.c;h=fcbd80ec44090dbc28b83d6987b999374e447e08;hp=af952694593f007f2e95fe6e0eac14abcead0d8a;hb=9b7adfbe;hpb=5f263a7753dc728809ff85c993af975f6c76e61e diff --git a/src/lib/lwp/sel.c b/src/lib/lwp/sel.c index af9526945..fcbd80ec4 100644 --- a/src/lib/lwp/sel.c +++ b/src/lib/lwp/sel.c @@ -50,201 +50,204 @@ #if defined(_EMPTH_LWP) struct lwpSelect { - int maxfd; - int nfds; - int nfile; - fd_set readmask; - fd_set writemask; - struct lwpProc **wait; - struct lwpQueue delayq; - struct lwpProc *proc; + int maxfd; + int nfds; + int nfile; + fd_set readmask; + fd_set writemask; + struct lwpProc **wait; + struct lwpQueue delayq; + struct lwpProc *proc; }; struct lwpSelect LwpSelect; -void lwpInitSelect(proc) - struct lwpProc *proc; +void +lwpInitSelect(proc) +struct lwpProc *proc; { - LwpSelect.maxfd = 0; - LwpSelect.nfds = 0; + LwpSelect.maxfd = 0; + LwpSelect.nfds = 0; #ifdef hpux - LwpSelect.nfile = _NFILE; + LwpSelect.nfile = _NFILE; #else - LwpSelect.nfile = getdtablesize(); + LwpSelect.nfile = getdtablesize(); #endif - FD_ZERO(&LwpSelect.readmask); - FD_ZERO(&LwpSelect.writemask); - LwpSelect.wait = (struct lwpProc **) - calloc(LwpSelect.nfile, sizeof(char *)); - LwpSelect.delayq.head = 0; - LwpSelect.delayq.tail = 0; - LwpSelect.proc = proc; + FD_ZERO(&LwpSelect.readmask); + FD_ZERO(&LwpSelect.writemask); + LwpSelect.wait = (struct lwpProc **) + calloc(LwpSelect.nfile, sizeof(char *)); + LwpSelect.delayq.head = 0; + LwpSelect.delayq.tail = 0; + LwpSelect.proc = proc; } -void lwpSleepFd(fd, mask) - int fd; - int mask; +void +lwpSleepFd(fd, mask) +int fd; +int mask; { - extern struct lwpProc *LwpCurrent; - - lwpStatus(LwpCurrent, "sleeping on fd %d", fd); - - if (LwpSelect.wait[fd] != 0) { - lwpStatus(LwpCurrent, - "multiple sleeps attempted on file descriptor %d", fd); - return; - } - if (mask & LWP_FD_READ) - FD_SET(fd, &LwpSelect.readmask); - if (mask & LWP_FD_WRITE) - FD_SET(fd, &LwpSelect.writemask); - - LwpSelect.nfds++; - - if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { - /* select process is sleeping until first waiter arrives */ - lwpStatus(LwpCurrent, "going to resched fd %d", fd); - lwpReady(LwpSelect.proc); - } - lwpStatus(LwpCurrent, "going to wait on fd %d", fd); - if (fd > LwpSelect.maxfd) - LwpSelect.maxfd = fd; - LwpSelect.wait[fd] = LwpCurrent; - LwpCurrent->fd = fd; - lwpReschedule(); + extern struct lwpProc *LwpCurrent; + + lwpStatus(LwpCurrent, "sleeping on fd %d", fd); + + if (LwpSelect.wait[fd] != 0) { + lwpStatus(LwpCurrent, + "multiple sleeps attempted on file descriptor %d", fd); + return; + } + if (mask & LWP_FD_READ) + FD_SET(fd, &LwpSelect.readmask); + if (mask & LWP_FD_WRITE) + FD_SET(fd, &LwpSelect.writemask); + + LwpSelect.nfds++; + + if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { + /* select process is sleeping until first waiter arrives */ + lwpStatus(LwpCurrent, "going to resched fd %d", fd); + lwpReady(LwpSelect.proc); + } + lwpStatus(LwpCurrent, "going to wait on fd %d", fd); + if (fd > LwpSelect.maxfd) + LwpSelect.maxfd = fd; + LwpSelect.wait[fd] = LwpCurrent; + LwpCurrent->fd = fd; + lwpReschedule(); } -void lwpWakeupFd(proc) - struct lwpProc *proc; +void +lwpWakeupFd(proc) +struct lwpProc *proc; { - if (proc->fd < 0) - return; - - lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd); - FD_CLR(proc->fd, &LwpSelect.readmask); - FD_CLR(proc->fd, &LwpSelect.writemask); - LwpSelect.nfds--; - LwpSelect.wait[proc->fd] = 0; - proc->fd = -1; - lwpReady(proc); + if (proc->fd < 0) + return; + + lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd); + FD_CLR(proc->fd, &LwpSelect.readmask); + FD_CLR(proc->fd, &LwpSelect.writemask); + LwpSelect.nfds--; + LwpSelect.wait[proc->fd] = 0; + proc->fd = -1; + lwpReady(proc); } -void lwpSleepUntil(until) - long until; +void +lwpSleepUntil(until) +long until; { - extern struct lwpProc *LwpCurrent; - - lwpStatus(LwpCurrent, "sleeping for %d sec", until - time(0)); - LwpCurrent->runtime = until; - if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { - /* select process is sleeping until first waiter arrives */ - lwpReady(LwpSelect.proc); - } - lwpAddTail(&LwpSelect.delayq, LwpCurrent); - lwpReschedule(); + extern struct lwpProc *LwpCurrent; + + lwpStatus(LwpCurrent, "sleeping for %d sec", until - time(0)); + LwpCurrent->runtime = until; + if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { + /* select process is sleeping until first waiter arrives */ + lwpReady(LwpSelect.proc); + } + lwpAddTail(&LwpSelect.delayq, LwpCurrent); + lwpReschedule(); } /*ARGSUSED*/ void lwpSelect(argc, argv) - int argc; - char **argv; +int argc; +char **argv; { - extern struct lwpProc *LwpCurrent; - struct lwpProc *us = LwpCurrent; - fd_set readmask; - fd_set writemask; - int n; - int fd; - time_t now; - time_t delta; - struct lwpProc *proc; - struct timeval tv; - struct lwpQueue save; - - lwpStatus(us, "starting select loop"); - FD_ZERO(&readmask); - FD_ZERO(&writemask); + extern struct lwpProc *LwpCurrent; + struct lwpProc *us = LwpCurrent; + fd_set readmask; + fd_set writemask; + int n; + int fd; + time_t now; + time_t delta; + struct lwpProc *proc; + struct timeval tv; + struct lwpQueue save; + + lwpStatus(us, "starting select loop"); + FD_ZERO(&readmask); + FD_ZERO(&writemask); + while (1) { while (1) { - while (1) { - if (LwpSelect.nfds) - break; - if (LwpSelect.delayq.head) - break; - /* wait for someone to lwpSleepFd or lwpSleepUntil */ - LwpSelect.maxfd = 0; - lwpStatus(us, "no fds or sleepers, waiting"); - lwpReschedule(); - } - tv.tv_sec = 1000000; - tv.tv_usec = 0; - if (LwpSelect.delayq.head) { - time(&now); - proc = LwpSelect.delayq.head; - for ( ; proc != 0; proc = proc->next) { - delta = proc->runtime - now; - if (delta < tv.tv_sec) - tv.tv_sec = delta; - } - if (tv.tv_sec < 0) - tv.tv_sec = 0; - } - lwpStatus(us, "selecting; sleep %ld secs", (long)delta); - - bcopy((s_char *)&LwpSelect.readmask, (s_char *)&readmask, sizeof(fd_set)); - bcopy((s_char *)&LwpSelect.writemask, (s_char *)&writemask, sizeof(fd_set)); - n = select(LwpSelect.maxfd + 1, &readmask, &writemask, - (fd_set *)0, &tv); - - if (n < 0) { - if (errno == EINTR) { - /* go handle the signal */ - lwpReady(us); - lwpReschedule(); - continue; - } - lwpStatus(us, - "select failed (bad file descriptor?)"); - exit(-1); + if (LwpSelect.nfds) + break; + if (LwpSelect.delayq.head) + break; + /* wait for someone to lwpSleepFd or lwpSleepUntil */ + LwpSelect.maxfd = 0; + lwpStatus(us, "no fds or sleepers, waiting"); + lwpReschedule(); + } + tv.tv_sec = 1000000; + tv.tv_usec = 0; + if (LwpSelect.delayq.head) { + time(&now); + proc = LwpSelect.delayq.head; + for (; proc != 0; proc = proc->next) { + delta = proc->runtime - now; + if (delta < tv.tv_sec) + tv.tv_sec = delta; + } + if (tv.tv_sec < 0) + tv.tv_sec = 0; + } + lwpStatus(us, "selecting; sleep %ld secs", (long)delta); + + bcopy((s_char *)&LwpSelect.readmask, (s_char *)&readmask, + sizeof(fd_set)); + bcopy((s_char *)&LwpSelect.writemask, (s_char *)&writemask, + sizeof(fd_set)); + n = select(LwpSelect.maxfd + 1, &readmask, &writemask, + (fd_set *) 0, &tv); + + if (n < 0) { + if (errno == EINTR) { + /* go handle the signal */ + lwpReady(us); + lwpReschedule(); + continue; + } + lwpStatus(us, "select failed (bad file descriptor?)"); + exit(-1); + } + + if (LwpSelect.delayq.head) { + /* sleeping proecss activity */ + time(&now); + save.tail = save.head = 0; + while (NULL != (proc = lwpGetFirst(&LwpSelect.delayq))) { + if (now >= proc->runtime) { + lwpStatus(proc, "sleep done"); + lwpReady(proc); + } else { + lwpAddTail(&save, proc); } - - if (LwpSelect.delayq.head) { - /* sleeping proecss activity */ - time(&now); - save.tail = save.head = 0; - while (NULL != (proc = lwpGetFirst(&LwpSelect.delayq))) { - if (now >= proc->runtime) { - lwpStatus(proc, "sleep done"); - lwpReady(proc); - } else { - lwpAddTail(&save, proc); - } - } - LwpSelect.delayq = save; + } + LwpSelect.delayq = save; + } + if (n > 0) { + /* file descriptor activity */ + for (fd = 0; fd <= LwpSelect.maxfd; fd++) { + if (LwpSelect.wait[fd] == 0) + continue; + if (FD_ISSET(fd, &readmask)) { + lwpStatus(LwpSelect.wait[fd], "input ready"); + lwpWakeupFd(LwpSelect.wait[fd]); + continue; } - if (n > 0) { - /* file descriptor activity */ - for(fd = 0; fd <= LwpSelect.maxfd; fd++) { - if (LwpSelect.wait[fd] == 0) - continue; - if (FD_ISSET(fd, &readmask)) { - lwpStatus(LwpSelect.wait[fd], - "input ready"); - lwpWakeupFd(LwpSelect.wait[fd]); - continue; - } - if (FD_ISSET(fd, &writemask)) { - lwpStatus(LwpSelect.wait[fd], - "output ready"); - lwpWakeupFd(LwpSelect.wait[fd]); - continue; - } - } + if (FD_ISSET(fd, &writemask)) { + lwpStatus(LwpSelect.wait[fd], "output ready"); + lwpWakeupFd(LwpSelect.wait[fd]); + continue; } - lwpStatus(us, "fd dispatch completed"); - lwpReady(LwpCurrent); - lwpReschedule(); + } } - /*NOTREACHED*/ + lwpStatus(us, "fd dispatch completed"); + lwpReady(LwpCurrent); + lwpReschedule(); + } + /*NOTREACHED*/ } #endif