Fixes instigated by attempting to compile Tcl-7.6. - gettimeofday() used wrong device for time sampling - vfprintf.c ignored left justification in favour of zero left padding - wait.c was rewritten to reap processes by PID - _buf.c miscalculated the number of open FDs in select() - added wait3() and wait4() prototypes to "sys/wait.h" - unprotected hypot() prototype in "math.h". Reference: /n/sources/patch/applied/apeldr02 Date: Wed Jun 16 19:21:35 CES 2004 --- /sys/src/ape/lib/bsd/gettimeofday.c Wed Jun 16 19:21:35 2004 +++ /sys/src/ape/lib/bsd/gettimeofday.c Wed Jun 16 19:21:35 2004 @@ -30,7 +30,7 @@ vlong t; memset(b, 0, sizeof b); - f = _OPEN("/dev/time", 0); + f = _OPEN("/dev/bintime", 0); if(f >= 0) { _PREAD(f, b, sizeof(b), 0); _CLOSE(f); --- /sys/src/ape/lib/ap/stdio/vfprintf.c Wed Jun 16 19:21:36 2004 +++ /sys/src/ape/lib/ap/stdio/vfprintf.c Wed Jun 16 19:21:35 2004 @@ -536,7 +536,7 @@ if(sign) putc('-', f); else if(flags&SIGN) putc('+', f); else if(flags&SPACE) putc(' ', f); - if(flags&ZPAD) + if((flags&ZPAD) && !(flags&LEFT)) while(nout < width){ putc('0', f); nout++; --- /sys/src/ape/lib/ap/plan9/wait.c Wed Jun 16 19:21:36 2004 +++ /sys/src/ape/lib/ap/plan9/wait.c Wed Jun 16 19:21:36 2004 @@ -7,66 +7,126 @@ #include #include "sys9.h" +/* +** PID cache +*/ +typedef struct wdesc wdesc; +struct wdesc { + pid_t w_pid; + Waitmsg *w_msg; + wdesc *w_next; +}; +static wdesc *wd = 0; + +static Waitmsg * +lookpid (pid_t pid) { + wdesc **wp0 = &wd, *wp; + Waitmsg *msg; + + if (pid == -1) { + if (wd == 0) + return 0; + pid = wd->w_pid; + } + for (wp = wd; wp; wp = wp->w_next) { + if (wp->w_pid == pid) { + msg = wp->w_msg; + *wp0 = wp->w_next; + free (wp); + return msg; + } + wp0 = &(wp->w_next); + } + return 0; +} + +static void +addpid (Waitmsg *msg) { + wdesc *wp = malloc (sizeof (wdesc)); + + wp->w_msg = msg; + wp->w_pid = msg->pid; + wp->w_next = wd; + wd = wp; +} + +pid_t +wait (int *status) { + return wait4(-1, status, 0, 0); +} + pid_t -wait(int *stat_loc) -{ - return waitpid(-1, stat_loc, 0); +waitpid (pid_t wpid, int *status, int options) { + return wait4(wpid, status, options, 0); } pid_t -waitpid(int pid, int *stat_loc, int options) -{ - int n, i, wfd, r, t, wpid; - char *bp, *ep, pname[50]; - struct stat buf; +wait3 (int *status, int options, Waitmsg *waitmsg) { + return wait4(-1, status, options, waitmsg); +} + +pid_t +wait4 (pid_t wpid, int *status, int options, Waitmsg *waitmsg) { Waitmsg *w; - if(options&WNOHANG){ - sprintf(pname, "/proc/%d/wait", getpid()); - i = stat(pname, &buf); - if(i >=0 && buf.st_size==0) + if (options & WNOHANG) { + char pname[128]; + int i; + struct stat buf; + + snprintf (pname, sizeof (pname), "/proc/%d/wait", getpid()); + i = stat (pname, &buf); + if (i >= 0 && buf.st_size == 0) return 0; } - n = 0; - while(n==0){ - w = _WAIT(); - if(w == 0){ - _syserrno(); - n = -1; - }else{ + if (w = lookpid (wpid)) { + waitmsg = w; + wpid = w->pid; + return wpid; + } + w = _WAIT(); + while (w) { + if (wpid <= 0) { + waitmsg = w; wpid = w->pid; - if(pid>0 && wpid!=pid){ - free(w); - continue; - } - n = wpid; - if(stat_loc){ - r = 0; - t = 0; - if(w->msg[0]){ + return wpid; + } + if (w->pid == wpid) { + if (status) { + int r = 0; + int t = 0; + char *bp, *ep; + + if (w->msg[0]) { /* message is 'prog pid:string' */ bp = w->msg; - while(*bp){ - if(*bp++ == ':') + while (*bp) { + if (*bp++ == ':') break; } - if(*bp == 0) + if (*bp == 0) bp = w->msg; - r = strtol(bp, &ep, 10); - if(*ep == 0){ - if(r < 0 || r >= 256) + r = strtol (bp, &ep, 10); + if (*ep == 0) { + if (r < 0 || r >= 256) r = 1; - }else{ - t = _stringsig(bp); - if(t == 0) + } else { + t = _stringsig (bp); + if (t == 0) r = 1; } } - *stat_loc = (r << 8) | t; + *status = (r << 8) | t; } - free(w); + waitmsg = w; + wpid = w->pid; + return wpid; + } else { + addpid (w); } + w = _WAIT(); + } + if (w == 0) { + _syserrno (); } - return n; } - --- /sys/src/ape/lib/ap/plan9/_buf.c Wed Jun 16 19:21:35 2004 +++ /sys/src/ape/lib/ap/plan9/_buf.c Wed Jun 16 19:21:35 2004 @@ -284,8 +284,8 @@ /* make sure all requested rfds and efds are buffered */ if(nfds >= OPEN_MAX) - nfds = OPEN_MAX-1; - for(i = 0; i<= nfds; i++) + nfds = OPEN_MAX; + for(i = 0; i < nfds; i++) if((rfds && FD_ISSET(i, rfds)) || (efds && FD_ISSET(i, efds))){ f = &_fdinfo[i]; if(!(f->flags&FD_BUFFERED)) --- /sys/include/ape/sys/wait.h Wed Jun 16 19:21:36 2004 +++ /sys/include/ape/sys/wait.h Wed Jun 16 19:21:36 2004 @@ -20,6 +20,8 @@ pid_t wait(int *); pid_t waitpid(pid_t, int *, int); +pid_t wait3(int *, int, void *); +pid_t wait4(pid_t, int *, int, void *); #ifdef __cplusplus } --- /386/include/ape/math.h Wed Jun 16 19:21:35 2004 +++ /386/include/ape/math.h Wed Jun 16 19:21:35 2004 @@ -71,7 +71,4 @@ } #endif -#define isnan(x) isNaN(x) -#define isinf(x) isInf(x) - #endif /* __MATH */