| tlibthread: simplify alt tracking, possibly fixing bug - plan9port - [fork] Plan 9 from user space |
| git clone git://src.adamsgaard.dk/plan9port |
| Log |
| Files |
| Refs |
| README |
| LICENSE |
| --- |
| commit 47ede89e4a832de2dada80599c1260f456275f19 |
| parent acecbb161981dcbe1f1e356c3ad586741a2240b9 |
| Author: Russ Cox |
| 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; ialt = 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 |