Debugging libthread for acme.

This commit is contained in:
rsc 2004-03-05 01:12:11 +00:00
parent 315e309098
commit 02a1a5c18b
5 changed files with 62 additions and 12 deletions

View file

@ -63,6 +63,8 @@ threadmain(int argc, char *argv[])
int ncol;
Display *d;
extern int _threaddebuglevel;
_threaddebuglevel = ~0;
rfork(RFENVG|RFNAMEG);
ncol = -1;

View file

@ -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;
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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 */
};