commit 02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4 from: rsc date: Fri Mar 05 01:12:11 2004 UTC Debugging libthread for acme. commit - 315e309098f8b9f6ee8f869ceef8ea0aacce6c60 commit + 02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4 blob - 87924caa47211b1bf3d0b435d1b90dfe661ce4aa blob + 4e047c1dde0743275c5c6f13d58173c56ab2c613 --- src/cmd/acme/acme.c +++ src/cmd/acme/acme.c @@ -63,6 +63,8 @@ threadmain(int argc, char *argv[]) int ncol; Display *d; +extern int _threaddebuglevel; +_threaddebuglevel = ~0; rfork(RFENVG|RFNAMEG); ncol = -1; blob - 4f642c84b4e4f8a52d9ad6407ddd9a9e59a2515a blob + 957a352ba57879c7f9b696becb13a9e405261bc3 --- src/libthread/channel.c +++ src/libthread/channel.c @@ -9,6 +9,16 @@ static int altexec(Alt*, int); int _threadhighnentry; int _threadnalt; +static void +setuserpc(ulong pc) +{ + Thread *t; + + t = _threadgetproc()->thread; + if(t) + t->userpc = pc; +} + static int canexec(Alt *a) { @@ -86,8 +96,8 @@ chancreate(int elemsize, int elemcnt) return c; } -int -alt(Alt *alts) +static int +_alt(Alt *alts) { Alt *a, *xa; Channel *volatile c; @@ -197,6 +207,13 @@ _threadnalt++; return a - alts; } +int +alt(Alt *alts) +{ + setuserpc(getcallerpc(&alts)); + return _alt(alts); +} + static int runop(int op, Channel *c, void *v, int nb) { @@ -214,7 +231,7 @@ runop(int op, Channel *c, void *v, int nb) a[1].op = CHANEND; if(nb) a[1].op = CHANNOBLK; - switch(r=alt(a)){ + switch(r=_alt(a)){ case -1: /* interrupted */ return -1; case 1: /* nonblocking, didn't accomplish anything */ @@ -232,24 +249,28 @@ runop(int op, Channel *c, void *v, int nb) int recv(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); return runop(CHANRCV, c, v, 0); } int nbrecv(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); return runop(CHANRCV, c, v, 1); } int send(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); return runop(CHANSND, c, v, 0); } int nbsend(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); return runop(CHANSND, c, v, 1); } @@ -266,6 +287,7 @@ channelsize(Channel *c, int sz) int sendul(Channel *c, ulong v) { + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(ulong)); return send(c, &v); } @@ -275,8 +297,9 @@ recvul(Channel *c) { ulong v; + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(ulong)); - if(recv(c, &v) < 0) + if(runop(CHANRCV, c, &v, 0) < 0) return ~0; return v; } @@ -284,8 +307,9 @@ recvul(Channel *c) int sendp(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(void*)); - return send(c, &v); + return runop(CHANSND, c, &v, 0); } void* @@ -293,8 +317,9 @@ recvp(Channel *c) { void *v; + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(void*)); - if(recv(c, &v) < 0) + if(runop(CHANRCV, c, &v, 0) < 0) return nil; return v; } @@ -302,8 +327,9 @@ recvp(Channel *c) int nbsendul(Channel *c, ulong v) { + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(ulong)); - return nbsend(c, &v); + return runop(CHANSND, c, &v, 1); } ulong @@ -311,8 +337,9 @@ nbrecvul(Channel *c) { ulong v; + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(ulong)); - if(nbrecv(c, &v) == 0) + if(runop(CHANRCV, c, &v, 1) == 0) return 0; return v; } @@ -320,8 +347,9 @@ nbrecvul(Channel *c) int nbsendp(Channel *c, void *v) { + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(void*)); - return nbsend(c, &v); + return runop(CHANSND, c, &v, 1); } void* @@ -329,8 +357,9 @@ nbrecvp(Channel *c) { void *v; + setuserpc(getcallerpc(&c)); channelsize(c, sizeof(void*)); - if(nbrecv(c, &v) == 0) + if(runop(CHANRCV, c, &v, 1) == 0) return nil; return v; } blob - 5306147134f8b39f4978b845825a8c5cc9ca5551 blob + 96d993359c1c26947227b79c88ab031fd63d3daf --- src/libthread/main.c +++ src/libthread/main.c @@ -15,6 +15,13 @@ static void mainlauncher(void*); extern void (*_sysfatal)(char*, va_list); void +_threadstatus(int x) +{ + USED(x); + threadstatus(); +} + +void _threaddie(int x) { extern char *_threadexitsallstatus; @@ -38,6 +45,7 @@ main(int argc, char **argv) signal(SIGTERM, _threaddie); signal(SIGCHLD, _nop); + signal(SIGINFO, _threadstatus); // rfork(RFREND); //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0; blob - 755fc28006ac8513d88f218838410ce3c64ae8e3 blob + 250a19a2a86a64b88daead0947776cfa80504035 --- src/libthread/sched.c +++ src/libthread/sched.c @@ -4,7 +4,6 @@ //static Thread *runthread(Proc*); -#if 0 static char *_psstate[] = { "Dead", "Running", @@ -19,7 +18,6 @@ psstate(int s) return "unknown"; return _psstate[s]; } -#endif void _schedinit(void *arg) @@ -270,4 +268,16 @@ yield(void) { _sched(); } + +void +threadstatus(void) +{ + Proc *p; + Thread *t; + p = _threadgetproc(); + for(t=p->threads.head; t; t=t->nextt) + fprint(2, "[%3d] %s userpc=%lux\n", + t->id, psstate(t->state), t->userpc); +} + blob - 590342abbadb3aed1e01313f0f474d0e646b5fce blob + e2e92a1b12b91846bd28f2029f181e0d78206ae2 --- src/libthread/threadimpl.h +++ src/libthread/threadimpl.h @@ -96,6 +96,7 @@ struct Thread Chanstate chan; /* which channel operation is current */ Alt *alt; /* pointer to current alt structure (debugging) */ + ulong userpc; void* udata[NPRIV]; /* User per-thread data pointer */ };