commit a0a331aad99bbca5a13fa4b69593061f29dc3a29 from: rsc date: Thu Jan 06 23:43:42 2005 UTC add _procwakeupandunlock to help ease locking contention on Linux 2.4. commit - 815552b9ed41df2f20892f6467dd47f91f93aca1 commit + a0a331aad99bbca5a13fa4b69593061f29dc3a29 blob - 85003c29d2296f7d29ec7f074a7d5477dc130bc0 blob + 25a98d9607aa6702e85811086639a8c089d1a6f5 --- src/libthread/Linux.c +++ src/libthread/Linux.c @@ -32,7 +32,7 @@ _threadlock(Lock *l, int block, ulong pc) { int i; static int first=1; -if(first) {first=0; fmtinstall('T', timefmt);} +if(first) {first=0; fmtinstall('\001', timefmt);} USED(pc); @@ -48,43 +48,43 @@ if(first) {first=0; fmtinstall('T', timefmt);} return 1; sched_yield(); } - /* now nice and slow */ + /* now increasingly slow */ for(i=0; i<10; i++){ if(!_tas(&l->held)) return 1; usleep(1); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop1 %p from %lux\n", argv0, l, pc); for(i=0; i<10; i++){ if(!_tas(&l->held)) return 1; usleep(10); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop2 %p from %lux\n", argv0, l, pc); for(i=0; i<10; i++){ if(!_tas(&l->held)) return 1; usleep(100); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop3 %p from %lux\n", argv0, l, pc); for(i=0; i<10; i++){ if(!_tas(&l->held)) return 1; usleep(1000); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop4 %p from %lux\n", argv0, l, pc); for(i=0; i<10; i++){ if(!_tas(&l->held)) return 1; usleep(10*1000); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop5 %p from %lux\n", argv0, l, pc); for(i=0; i<1000; i++){ if(!_tas(&l->held)) return 1; usleep(100*1000); } -fprint(2, "%T lock loop %p from %lux\n", l, pc); +fprint(2, "%\001 %s: lock loop6 %p from %lux\n", argv0, l, pc); /* take your time */ while(_tas(&l->held)) usleep(1000*1000); @@ -150,13 +150,20 @@ again: } void -_procwakeup(_Procrendez *r) +_procwakeupandunlock(_Procrendez *r) { + int pid; + + pid = 0; if(r->asleep){ r->asleep = 0; assert(r->pid >= 1); - kill(r->pid, SIGUSR1); + pid = r->pid; } + assert(r->l); + unlock(r->l); + if(pid) + kill(pid, SIGUSR1); } /* blob - 3c408825c181163256731bac810b08c2dd5e6d18 blob + da8ec977bbd6f64da83052545f1d6b002d84862d --- src/libthread/daemonize.c +++ src/libthread/daemonize.c @@ -1,3 +1,6 @@ +#include +#include +#include #include "threadimpl.h" #undef waitpid @@ -11,6 +14,7 @@ static void child(void) { int status, pid; + struct rlimit rl; notedisable("sys: child"); pid = waitpid(sigpid, &status, 0); @@ -21,6 +25,14 @@ child(void) if(WIFEXITED(status)) _exit(WEXITSTATUS(status)); if(WIFSIGNALED(status)){ + /* + * Make sure we don't scribble over the nice + * core file that our child just wrote out. + */ + rl.rlim_cur = 0; + rl.rlim_max = 0; + setrlimit(RLIMIT_CORE, &rl); + signal(WTERMSIG(status), SIG_DFL); raise(WTERMSIG(status)); _exit(98); /* not reached */ blob - fcc309b7b422a26d81d9231f2918ac8ffb74ed5b blob + 38eb7d78cc07ebd507b22d0cd0208b82d2ac0796 --- src/libthread/pthread.c +++ src/libthread/pthread.c @@ -67,6 +67,16 @@ _procwakeup(_Procrendez *r) } } +void +_procwakeupandunlock(_Procrendez *r) +{ + if(r->asleep){ + r->asleep = 0; + pthread_cond_signal(&r->cond); + } + unlock(&r->l); +} + static void startprocfn(void *v) { blob - ee73f752c352d3b658d7fd49d564f616f7fa1985 blob + 8a028aa4a227de952f8fcc00f2ad895e6974a98a --- src/libthread/thread.c +++ src/libthread/thread.c @@ -166,11 +166,13 @@ _threadready(_Thread *t) p = t->proc; lock(&p->lock); + p->runrend.l = &p->lock; addthread(&p->runqueue, t); //print("%d wake for job %d->%d\n", time(0), getpid(), p->osprocid); if(p != proc()) - _procwakeup(&p->runrend); - unlock(&p->lock); + _procwakeupandunlock(&p->runrend); + else + unlock(&p->lock); } int blob - 6368ff5482f98fdf23e9f0015563d712af736d0f blob + bbf847365ca56039395cdb78965c1968ef5b2670 --- src/libthread/threadimpl.h +++ src/libthread/threadimpl.h @@ -76,6 +76,7 @@ struct _Procrendez extern void _procsleep(_Procrendez*); extern void _procwakeup(_Procrendez*); +extern void _procwakeupandunlock(_Procrendez*); struct Proc {