add threaddaemonize(), more bug fixes
diff --git a/include/thread.h b/include/thread.h index 7ba96e6..84adb22 100644 --- a/include/thread.h +++ b/include/thread.h
@@ -22,6 +22,11 @@ #define yield threadyield /* + * daemonize + */ +void threaddaemonize(void); + +/* * per proc and thread data */ void **procdata(void);
diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c index 357e926..1c9d8c2 100644 --- a/src/libthread/Linux.c +++ b/src/libthread/Linux.c
@@ -8,6 +8,9 @@ #include "thread.h" #include "threadimpl.h" +int ngetpid; + + /* * spin locks */ @@ -99,15 +102,12 @@ sigdelset(&mask, SIGUSR1); sigsuspend(&mask); -//print("%d %d awake again\n", time(0), getpid()); - /* * We're awake. Make USR1 not interrupt system calls. */ lock(r->l); ignusr1(1); if(r->asleep && r->pid == getpid()){ -//print("resleep %d\n", getpid()); /* Didn't really wake up - signal from something else */ goto again; } @@ -160,11 +160,15 @@ next = sf->next; if(sf->pid >= 1 && kill(sf->pid, 0) < 0 && errno == ESRCH){ free(sf); - last->next = next; + if(last) + last->next = next; + else + stackfree = next; sf = last; } } -} + unlock(&stacklock); +} static int startprocfn(void *v) @@ -240,7 +244,7 @@ void sigusr2handler(int s) { - print("%d usr2 %d\n", time(0), getpid()); +/* fprint(2, "%d usr2 %d\n", time(0), getpid()); */ if(threadexitsmsg) _exits(threadexitsmsg); } @@ -341,7 +345,8 @@ { Perproc *pp; - p->osprocid = getpid(); + if(p) + p->osprocid = getpid(); pp = newperproc(); pp->proc = p; if(p == nil)
diff --git a/src/libthread/ioproc.c b/src/libthread/ioproc.c index 2296690..0bf7946 100644 --- a/src/libthread/ioproc.c +++ b/src/libthread/ioproc.c
@@ -20,6 +20,8 @@ xioproc(void *a) { Ioproc *io, *x; + + threadsetname("ioproc"); io = a; /* * first recvp acquires the ioproc.
diff --git a/src/libthread/mkfile b/src/libthread/mkfile index a301d48..fc68149 100644 --- a/src/libthread/mkfile +++ b/src/libthread/mkfile
@@ -6,6 +6,7 @@ OFILES=\ $SYSOFILES\ channel.$O\ + daemonize.$O\ exec.$O\ ioproc.$O\ iorw.$O\
diff --git a/src/libthread/test/mkfile b/src/libthread/test/mkfile index b3fd821..87dd932 100644 --- a/src/libthread/test/mkfile +++ b/src/libthread/test/mkfile
@@ -3,6 +3,6 @@ SHORTLIB=thread 9 OFILES= -TARG=tprimes tspawn tspawnloop +TARG=tprimes tspawn tspawnloop tdaemon <$PLAN9/src/mkmany
diff --git a/src/libthread/thread.c b/src/libthread/thread.c index 1837e7d..b41f9f3 100644 --- a/src/libthread/thread.c +++ b/src/libthread/thread.c
@@ -20,6 +20,25 @@ static void contextswitch(Context *from, Context *to); static void scheduler(Proc*); +static void +_threaddebug(char *fmt, ...) +{ + va_list arg; + char buf[128]; + _Thread *t; + + return; + + va_start(arg, fmt); + vsnprint(buf, sizeof buf, fmt, arg); + va_end(arg); + t = proc()->thread; + if(t) + fprint(2, "%d.%d: %s\n", getpid(), t->id, buf); + else + fprint(2, "%d._: %s\n", getpid(), buf); +} + static _Thread* getthreadnow(void) { @@ -50,6 +69,7 @@ t = v; t->startfn(t->startarg); + memset(&v, 0xff, 32); /* try to cut off stack traces */ threadexits(nil); } @@ -81,7 +101,7 @@ /* call makecontext to do the real work. */ /* leave a few words open on both ends */ t->context.uc.uc_stack.ss_sp = t->stk+8; - t->context.uc.uc_stack.ss_size = t->stksize-16; + t->context.uc.uc_stack.ss_size = t->stksize-64; makecontext(&t->context.uc, (void(*)())threadstart, 1, t); return t; @@ -185,6 +205,7 @@ _Thread *t; setproc(p); + _threaddebug("scheduler enter"); // print("s %p %d\n", p, gettid()); lock(&p->lock); for(;;){ @@ -192,15 +213,15 @@ if(p->nthread == 0) goto Out; p->runrend.l = &p->lock; -//print("%d sleep for jobs %d\n", time(0), getpid()); + _threaddebug("scheduler sleep"); _procsleep(&p->runrend); -//print("%d wake from jobs %d\n", time(0), getpid()); + _threaddebug("scheduler wake"); } delthread(&p->runqueue, t); unlock(&p->lock); p->thread = t; p->nswitch++; - // print("run %s %d\n", t->name, t->id); + _threaddebug("run %d (%s)", t->id, t->name); contextswitch(&p->schedcontext, &t->context); p->thread = nil; lock(&p->lock); @@ -212,6 +233,7 @@ } Out: + _threaddebug("scheduler exit"); delproc(p); lock(&threadnproclock); if(p->sysproc) @@ -447,11 +469,18 @@ threadmain(threadargc, threadargv); } +void +threadlinklibrary(void) +{ +} + int main(int argc, char **argv) { Proc *p; + _threadsetupdaemonize(); + threadargc = argc; threadargv = argv;
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index 164ba97..d4acebe 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h
@@ -5,8 +5,6 @@ typedef struct Proc Proc; typedef struct _Procrendez _Procrendez; - - typedef struct Jmp Jmp; struct Jmp { @@ -106,3 +104,5 @@ extern void _pthreadinit(void); extern int _threadspawn(int*, char*, char**); extern int _runthreadspawn(int*, char*, char**); +extern void _threadsetupdaemonize(void); +extern void _threaddodaemonize(char*);