libthread: simplify alt tracking, possibly fixing bug
This commit is contained in:
parent
acecbb1619
commit
47ede89e4a
3 changed files with 9 additions and 8 deletions
|
|
@ -82,7 +82,6 @@ struct Alt
|
|||
void *v;
|
||||
uint op;
|
||||
_Thread *thread;
|
||||
Alt *xalt;
|
||||
};
|
||||
|
||||
struct _Altarray
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ struct _Thread
|
|||
char name[256];
|
||||
char state[256];
|
||||
void *udata;
|
||||
Alt *alt;
|
||||
};
|
||||
|
||||
struct _Procrendez
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue