plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit 47ede89e4a832de2dada80599c1260f456275f19
parent acecbb161981dcbe1f1e356c3ad586741a2240b9
Author: Russ Cox <rsc@swtch.com>
Date:   Wed, 22 Aug 2007 11:14:30 -0400

libthread: simplify alt tracking, possibly fixing bug

Diffstat:
Minclude/thread.h | 1-
Msrc/libthread/channel.c | 15++++++++-------
Msrc/libthread/threadimpl.h | 1+
3 files changed, 9 insertions(+), 8 deletions(-)

diff --git 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 @@ -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; 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; @@ -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 @@ -114,6 +114,7 @@ struct _Thread char name[256]; char state[256]; void *udata; + Alt *alt; }; struct _Procrendez