commit - 815552b9ed41df2f20892f6467dd47f91f93aca1
commit + a0a331aad99bbca5a13fa4b69593061f29dc3a29
blob - 85003c29d2296f7d29ec7f074a7d5477dc130bc0
blob + 25a98d9607aa6702e85811086639a8c089d1a6f5
--- src/libthread/Linux.c
+++ src/libthread/Linux.c
{
int i;
static int first=1;
-if(first) {first=0; fmtinstall('T', timefmt);}
+if(first) {first=0; fmtinstall('\001', timefmt);}
USED(pc);
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);
}
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
+#include <u.h>
+#include <sys/time.h>
+#include <sys/resource.h>
#include "threadimpl.h"
#undef waitpid
child(void)
{
int status, pid;
+ struct rlimit rl;
notedisable("sys: child");
pid = waitpid(sigpid, &status, 0);
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
}
}
+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
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
extern void _procsleep(_Procrendez*);
extern void _procwakeup(_Procrendez*);
+extern void _procwakeupandunlock(_Procrendez*);
struct Proc
{