From c4097c29512269f4547ebefb8abdc57a2892b479 Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 11 May 2004 17:51:27 +0000 Subject: Fix small bugs. --- include/thread.h | 2 +- src/cmd/ls.C | 2 ++ src/cmd/rc/plan9ish.c | 2 +- src/cmd/time.c | 7 +++++-- src/lib9/notify.c | 15 +++++++++++++-- src/libthread/386.c | 13 +++++++------ src/libthread/PowerMacintosh.c | 2 +- src/libthread/create.c | 1 + src/libthread/fdwait.c | 25 ++++++++++++++++++++++++- src/libthread/main.c | 12 ------------ src/libthread/mkfile | 1 + src/libthread/sched.c | 15 ++++++++++----- src/libthread/sun4u.c | 2 +- src/libthread/threadimpl.h | 6 ++++-- 14 files changed, 71 insertions(+), 34 deletions(-) diff --git a/include/thread.h b/include/thread.h index 356d7b62..2721fb4e 100644 --- a/include/thread.h +++ b/include/thread.h @@ -121,7 +121,7 @@ Channel* threadwaitchan(void); int tprivalloc(void); void tprivfree(int); void **tprivaddr(int); -void yield(void); +int yield(void); long threadstack(void); diff --git a/src/cmd/ls.C b/src/cmd/ls.C index de2bee94..8bdeab61 100644 --- a/src/cmd/ls.C +++ b/src/cmd/ls.C @@ -101,6 +101,8 @@ ls(char *s, int multi) return 1; } if(db->qid.type&QTDIR && dflag==0){ + free(db); + db = nil; output(); fd = open(s, OREAD); if(fd == -1) diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c index 2b9011cc..6644778c 100644 --- a/src/cmd/rc/plan9ish.c +++ b/src/cmd/rc/plan9ish.c @@ -71,7 +71,7 @@ void Vinit(void){ for(s=*env;*s && *s!='(' && *s!='=';s++); switch(*s){ case '\0': - pfmt(err, "rc: odd environment %q?\n", *env); + // pfmt(err, "rc: odd environment %q?\n", *env); break; case '=': *s='\0'; diff --git a/src/cmd/time.c b/src/cmd/time.c index d82eaa94..3b52216b 100644 --- a/src/cmd/time.c +++ b/src/cmd/time.c @@ -11,6 +11,7 @@ main(int argc, char *argv[]) { int i; Waitmsg *w; + vlong t0, t1; long l; char *p; char err[ERRMAX]; @@ -20,6 +21,7 @@ main(int argc, char *argv[]) exits("usage"); } + t0 = nsec(); switch(fork()){ case -1: error("fork"); @@ -37,8 +39,9 @@ main(int argc, char *argv[]) loop: w = wait(); + t1 = nsec(); if(w == nil){ - errstr(err, sizeof err); + rerrstr(err, sizeof err); if(strcmp(err, "interrupted") == 0) goto loop; error("wait"); @@ -47,7 +50,7 @@ main(int argc, char *argv[]) add("%ld.%.2ldu", l/1000, (l%1000)/10); l = w->time[1]; add("%ld.%.2lds", l/1000, (l%1000)/10); - l = w->time[2]; + l = (t1-t0)/1000000; add("%ld.%.2ldr", l/1000, (l%1000)/10); add("\t"); for(i=1; ithread; - _threadstacklimit(t->stk); + _threadstacklimit(t->stk, t->stk+t->stksize); (*f)(arg); threadexits(nil); @@ -39,18 +39,19 @@ _threadinswitch(int enter) USED(enter); #ifdef USEVALGRIND if(enter) - VALGRIND_SET_STACK_LIMIT(0, 0, 1); - else VALGRIND_SET_STACK_LIMIT(0, 0, 0); + else + VALGRIND_SET_STACK_LIMIT(0, 0, 1); #endif } void -_threadstacklimit(void *addr) +_threadstacklimit(void *bottom, void *top) { - USED(addr); + USED(bottom); + USED(top); #ifdef USEVALGRIND - VALGRIND_SET_STACK_LIMIT(1, addr, 0); + VALGRIND_SET_STACK_LIMIT(1, bottom, top); #endif } diff --git a/src/libthread/PowerMacintosh.c b/src/libthread/PowerMacintosh.c index 21f6041d..94d4db9a 100644 --- a/src/libthread/PowerMacintosh.c +++ b/src/libthread/PowerMacintosh.c @@ -32,7 +32,7 @@ _threadinswitch(int enter) } void -_threadstacklimit(void *addr) +_threadstacklimit(void *addr, void *addr2) { USED(addr); } diff --git a/src/libthread/create.c b/src/libthread/create.c index b63fee44..f5f0d6c0 100644 --- a/src/libthread/create.c +++ b/src/libthread/create.c @@ -24,6 +24,7 @@ newthread(Proc *p, void (*f)(void *arg), void *arg, uint stacksize, char *name, if(stacksize < 32) sysfatal("bad stacksize %d", stacksize); t = _threadmalloc(sizeof(Thread), 1); + t->lastfd = -1; s = _threadmalloc(stacksize, 0); t->stk = (uchar*)s; t->stksize = stacksize; diff --git a/src/libthread/fdwait.c b/src/libthread/fdwait.c index 927fc64f..a6890332 100644 --- a/src/libthread/fdwait.c +++ b/src/libthread/fdwait.c @@ -2,12 +2,13 @@ #include #include #include - +#include "threadimpl.h" #include #include #include #define debugpoll 0 +static int noblocked[4096/32]; #ifdef __APPLE__ #include @@ -174,11 +175,15 @@ _threadfdwait(int fd, int rw, ulong pc) struct { Channel c; + Alt *qentry[2]; ulong x; } s; threadfdwaitsetup(); chaninit(&s.c, sizeof(ulong), 1); + s.c.qentry = (volatile Alt**)s.qentry; + s.c.nentry = 2; + memset(s.qentry, 0, sizeof s.qentry); for(i=0; ithread; + if(t && t->lastfd == fd) + return; fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); + if(t) + t->lastfd = fd; + + /* We could lock this but we're probably single-threaded + * and the worst that will happen is we'll run fcntl + * a few more times. + */ + noblocked[fd/(8*sizeof(int))] |= 1<<(fd%(8*sizeof(int))); } long diff --git a/src/libthread/main.c b/src/libthread/main.c index 04e6cd9f..bc7ad0f8 100644 --- a/src/libthread/main.c +++ b/src/libthread/main.c @@ -32,24 +32,12 @@ _threaddie(int x) exit(_threadexitsallstatus[0] ? 1 : 0); } -static void -_nop(int x) -{ - USED(x); -} - int main(int argc, char **argv) { Mainarg *a; Proc *p; - signal(SIGTERM, _threaddie); - signal(SIGCHLD, _nop); - signal(SIGALRM, _nop); -// signal(SIGINFO, _threadstatus); -// rfork(RFREND); - //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0; _systhreadinit(); _qlockinit(_threadrendezvous); diff --git a/src/libthread/mkfile b/src/libthread/mkfile index 1ced9021..f8ec8e80 100644 --- a/src/libthread/mkfile +++ b/src/libthread/mkfile @@ -59,6 +59,7 @@ asm-OpenBSD-386.$O: asm-FreeBSD-386.s # sorry VG=`test -d /home/rsc/pub/valgrind-debian && echo -DUSEVALGRIND` +# VG= CFLAGS=$CFLAGS $VG diff --git a/src/libthread/sched.c b/src/libthread/sched.c index 9ad7298b..bdb9ad6b 100644 --- a/src/libthread/sched.c +++ b/src/libthread/sched.c @@ -171,7 +171,7 @@ needstack(int howmuch) } } -void +int _sched(void) { Proc *p; @@ -186,8 +186,8 @@ Resched: // psstate(t->state), &t->sched, &p->sched); if(_setlabel(&t->sched)==0) _gotolabel(&p->sched); - _threadstacklimit(t->stk); - return; + _threadstacklimit(t->stk, t->stk+t->stksize); + return p->nsched++; }else{ t = runthread(p); if(t == nil){ @@ -277,10 +277,15 @@ _threadidle(void) unlock(&p->readylock); } -void +int yield(void) { - _sched(); + Proc *p; + int nsched; + + p = _threadgetproc(); + nsched = p->nsched; + return _sched() - nsched; } void diff --git a/src/libthread/sun4u.c b/src/libthread/sun4u.c index 6312dac9..0d2d8d24 100644 --- a/src/libthread/sun4u.c +++ b/src/libthread/sun4u.c @@ -46,7 +46,7 @@ _threadinswitch(int enter) } void -_threadstacklimit(void *addr) +_threadstacklimit(void *addr, void *addr2) { USED(addr); } diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index 373164ad..7e44e646 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h @@ -99,6 +99,7 @@ struct Thread ulong userpc; void* udata[NPRIV]; /* User per-thread data pointer */ + int lastfd; }; struct Execargs @@ -143,6 +144,7 @@ struct Proc Waitmsg *waitmsg; void* udata; /* User per-proc data pointer */ + int nsched; }; struct Pqueue { /* Proc queue */ @@ -169,7 +171,7 @@ void _freeproc(Proc*); Proc* _newproc(void(*)(void*), void*, uint, char*, int, int); int _procsplhi(void); void _procsplx(int); -void _sched(void); +int _sched(void); int _schedexec(Execargs*); void _schedexecwait(void); void _schedexit(Proc*); @@ -219,4 +221,4 @@ extern int _threadgetpid(void); extern void _threadmemset(void*, int, int); extern void _threaddebugmemset(void*, int, int); extern int _threadprocs; -extern void _threadstacklimit(void*); +extern void _threadstacklimit(void*, void*); -- cgit v1.2.3