diff options
Diffstat (limited to 'src/libthread')
-rw-r--r-- | src/libthread/channel.c | 15 | ||||
-rw-r--r-- | src/libthread/threadimpl.h | 1 |
2 files changed, 9 insertions, 7 deletions
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; 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 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 |