From 47ede89e4a832de2dada80599c1260f456275f19 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 22 Aug 2007 11:14:30 -0400 Subject: libthread: simplify alt tracking, possibly fixing bug --- include/thread.h | 1 - src/libthread/channel.c | 15 ++++++++------- src/libthread/threadimpl.h | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/thread.h b/include/thread.h index 2301191d..739fe0fe 100644 --- a/include/thread.h +++ b/include/thread.h @@ -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 index 903889a4..080f84de 100644 --- a/src/libthread/channel.c +++ b/src/libthread/channel.c @@ -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); @@ -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; @@ -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 index 2a69d497..bc18d3a4 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h @@ -114,6 +114,7 @@ struct _Thread char name[256]; char state[256]; void *udata; + Alt *alt; }; struct _Procrendez -- cgit v1.2.3