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