From 02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4 Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 5 Mar 2004 01:12:11 +0000 Subject: Debugging libthread for acme. --- src/cmd/acme/acme.c | 2 ++ src/libthread/channel.c | 49 ++++++++++++++++++++++++++++++++++++---------- src/libthread/main.c | 8 ++++++++ src/libthread/sched.c | 14 +++++++++++-- src/libthread/threadimpl.h | 1 + 5 files changed, 62 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c index 87924caa..4e047c1d 100644 --- a/src/cmd/acme/acme.c +++ b/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; diff --git a/src/libthread/channel.c b/src/libthread/channel.c index 4f642c84..957a352b 100644 --- a/src/libthread/channel.c +++ b/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; } diff --git a/src/libthread/main.c b/src/libthread/main.c index 53061471..96d99335 100644 --- a/src/libthread/main.c +++ b/src/libthread/main.c @@ -14,6 +14,13 @@ int _threadpasserpid; static void mainlauncher(void*); extern void (*_sysfatal)(char*, va_list); +void +_threadstatus(int x) +{ + USED(x); + threadstatus(); +} + void _threaddie(int x) { @@ -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; diff --git a/src/libthread/sched.c b/src/libthread/sched.c index 755fc280..250a19a2 100644 --- a/src/libthread/sched.c +++ b/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) @@ -271,3 +269,15 @@ 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); +} + diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index 590342ab..e2e92a1b 100644 --- a/src/libthread/threadimpl.h +++ b/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 */ }; -- cgit v1.2.3