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