diff options
author | rsc <devnull@localhost> | 2004-05-11 17:51:27 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-05-11 17:51:27 +0000 |
commit | c4097c29512269f4547ebefb8abdc57a2892b479 (patch) | |
tree | e84c61a845b196bfa903088e15b772ae0b16c8bb /src/libthread | |
parent | 2f2df5e02ef22c9727ae2b8269d5c76a061d296f (diff) | |
download | plan9port-c4097c29512269f4547ebefb8abdc57a2892b479.tar.gz plan9port-c4097c29512269f4547ebefb8abdc57a2892b479.tar.bz2 plan9port-c4097c29512269f4547ebefb8abdc57a2892b479.zip |
Fix small bugs.
Diffstat (limited to 'src/libthread')
-rw-r--r-- | src/libthread/386.c | 13 | ||||
-rw-r--r-- | src/libthread/PowerMacintosh.c | 2 | ||||
-rw-r--r-- | src/libthread/create.c | 1 | ||||
-rw-r--r-- | src/libthread/fdwait.c | 25 | ||||
-rw-r--r-- | src/libthread/main.c | 12 | ||||
-rw-r--r-- | src/libthread/mkfile | 1 | ||||
-rw-r--r-- | src/libthread/sched.c | 15 | ||||
-rw-r--r-- | src/libthread/sun4u.c | 2 | ||||
-rw-r--r-- | src/libthread/threadimpl.h | 6 |
9 files changed, 49 insertions, 28 deletions
diff --git a/src/libthread/386.c b/src/libthread/386.c index d8052f09..2c611e45 100644 --- a/src/libthread/386.c +++ b/src/libthread/386.c @@ -15,7 +15,7 @@ launcher386(void (*f)(void *arg), void *arg) p = _threadgetproc(); t = p->thread; - _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 <u.h> #include <libc.h> #include <thread.h> - +#include "threadimpl.h" #include <errno.h> #include <unistd.h> #include <fcntl.h> #define debugpoll 0 +static int noblocked[4096/32]; #ifdef __APPLE__ #include <sys/time.h> @@ -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; i<npoll; i++) if(pfd[i].fd == -1) break; @@ -223,7 +228,25 @@ threadsleep(int ms) void threadfdnoblock(int fd) { + Thread *t; + + if(fd<0) + return; + if(fd < 8*sizeof(int)*nelem(noblocked) + && (noblocked[fd/(8*sizeof(int))] & (1<<(fd%(8*sizeof(int)))))) + return; + t = _threadgetproc()->thread; + 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*); |