add _procwakeupandunlock to help ease locking contention on Linux 2.4.
diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c index 85003c2..25a98d9 100644 --- a/src/libthread/Linux.c +++ b/src/libthread/Linux.c
@@ -32,7 +32,7 @@ { 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 @@ 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 @@ } 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); } /*
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c index 3c40882..da8ec97 100644 --- a/src/libthread/daemonize.c +++ b/src/libthread/daemonize.c
@@ -1,3 +1,6 @@ +#include <u.h> +#include <sys/time.h> +#include <sys/resource.h> #include "threadimpl.h" #undef waitpid @@ -11,6 +14,7 @@ child(void) { int status, pid; + struct rlimit rl; notedisable("sys: child"); pid = waitpid(sigpid, &status, 0); @@ -21,6 +25,14 @@ 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 */
diff --git a/src/libthread/pthread.c b/src/libthread/pthread.c index fcc309b..38eb7d7 100644 --- a/src/libthread/pthread.c +++ b/src/libthread/pthread.c
@@ -67,6 +67,16 @@ } } +void +_procwakeupandunlock(_Procrendez *r) +{ + if(r->asleep){ + r->asleep = 0; + pthread_cond_signal(&r->cond); + } + unlock(&r->l); +} + static void startprocfn(void *v) {
diff --git a/src/libthread/thread.c b/src/libthread/thread.c index ee73f75..8a028aa 100644 --- a/src/libthread/thread.c +++ b/src/libthread/thread.c
@@ -166,11 +166,13 @@ 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
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index 6368ff5..bbf8473 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h
@@ -76,6 +76,7 @@ extern void _procsleep(_Procrendez*); extern void _procwakeup(_Procrendez*); +extern void _procwakeupandunlock(_Procrendez*); struct Proc {