tlibthread: simplify alt tracking, possibly fixing bug - plan9port - [fork] Pla… | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 47ede89e4a832de2dada80599c1260f456275f19 | |
parent acecbb161981dcbe1f1e356c3ad586741a2240b9 | |
Author: Russ Cox <[email protected]> | |
Date: Wed, 22 Aug 2007 11:14:30 -0400 | |
libthread: simplify alt tracking, possibly fixing bug | |
Diffstat: | |
M include/thread.h | 1 - | |
M src/libthread/channel.c | 15 ++++++++------- | |
M src/libthread/threadimpl.h | 1 + | |
3 files changed, 9 insertions(+), 8 deletions(-) | |
--- | |
diff --git a/include/thread.h b/include/thread.h | |
t@@ -82,7 +82,6 @@ struct Alt | |
void *v; | |
uint op; | |
_Thread *thread; | |
- Alt *xalt; | |
}; | |
struct _Altarray | |
diff --git a/src/libthread/channel.c b/src/libthread/channel.c | |
t@@ -234,8 +234,8 @@ altexec(Alt *a) | |
i = rand()%ar->n; | |
other = ar->a[i]; | |
altcopy(a, other); | |
- altalldequeue(other->xalt); | |
- other->xalt[0].xalt = other; | |
+ altalldequeue(other->thread->alt); | |
+ other->thread->alt = other; | |
_threadready(other->thread); | |
}else | |
altcopy(a, nil); | |
t@@ -256,10 +256,9 @@ chanalt(Alt *a) | |
canblock = a[i].op == CHANEND; | |
t = proc()->thread; | |
- for(i=0; i<n; i++){ | |
+ for(i=0; i<n; i++) | |
a[i].thread = t; | |
- a[i].xalt = a; | |
- } | |
+ t->alt = a; | |
qlock(&chanlock); | |
if(dbgalt) print("alt "); | |
ncan = 0; | |
t@@ -307,9 +306,11 @@ if(dbgalt)print("\n"); | |
/* | |
* the guy who ran the op took care of dequeueing us | |
- * and then set a[0].alt to the one that was executed. | |
+ * and then set t->alt to the one that was executed. | |
*/ | |
- return a[0].xalt - a; | |
+ if(t->alt < a || t->alt >= a+n) | |
+ sysfatal("channel bad alt"); | |
+ return t->alt - a; | |
} | |
static int | |
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h | |
t@@ -114,6 +114,7 @@ struct _Thread | |
char name[256]; | |
char state[256]; | |
void *udata; | |
+ Alt *alt; | |
}; | |
struct _Procrendez |