aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/channel.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-05 01:12:11 +0000
committerrsc <devnull@localhost>2004-03-05 01:12:11 +0000
commit02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4 (patch)
tree456ce23b6ffb80b5c893ce2dfec3b5a88fdf4f63 /src/libthread/channel.c
parent315e309098f8b9f6ee8f869ceef8ea0aacce6c60 (diff)
downloadplan9port-02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4.tar.gz
plan9port-02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4.tar.bz2
plan9port-02a1a5c18bec9ca13fad2b7b12ae65c580f6fdf4.zip
Debugging libthread for acme.
Diffstat (limited to 'src/libthread/channel.c')
-rw-r--r--src/libthread/channel.c49
1 files changed, 39 insertions, 10 deletions
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;
}