fix potential double ready in postnote() for rendezvous
This commit is contained in:
parent
3599f733ee
commit
9d60d8262e
2 changed files with 5 additions and 7 deletions
|
@ -95,7 +95,7 @@ schedinit(void) /* never returns */
|
|||
procalloc.free = up;
|
||||
|
||||
/* proc is free now, make sure unlock() wont touch it */
|
||||
up = procalloc.p = nil;
|
||||
up = procalloc.Lock.p = nil;
|
||||
unlock(&procalloc);
|
||||
sched();
|
||||
}
|
||||
|
@ -418,7 +418,7 @@ ready(Proc *p)
|
|||
print("double ready %s %lud pc %p\n", p->text, p->pid, getcallerpc(&p));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
s = splhi();
|
||||
if(edfready(p)){
|
||||
splx(s);
|
||||
|
@ -984,16 +984,16 @@ postnote(Proc *p, int dolock, char *n, int flag)
|
|||
if(p->state == Rendezvous) {
|
||||
Proc *d, **l;
|
||||
|
||||
p->rendval = ~0;
|
||||
l = &REND(p->rgrp, p->rendtag);
|
||||
for(d = *l; d; d = d->rendhash) {
|
||||
if(d == p) {
|
||||
*l = p->rendhash;
|
||||
p->rendval = ~0;
|
||||
ready(p);
|
||||
break;
|
||||
}
|
||||
l = &d->rendhash;
|
||||
}
|
||||
ready(p);
|
||||
}
|
||||
unlock(p->rgrp);
|
||||
break;
|
||||
|
|
|
@ -811,7 +811,6 @@ sysrendezvous(ulong *arg)
|
|||
|
||||
tag = arg[0];
|
||||
l = &REND(up->rgrp, tag);
|
||||
up->rendval = ~(uintptr)0;
|
||||
|
||||
lock(up->rgrp);
|
||||
for(p = *l; p; p = p->rendhash) {
|
||||
|
@ -819,11 +818,10 @@ sysrendezvous(ulong *arg)
|
|||
*l = p->rendhash;
|
||||
val = p->rendval;
|
||||
p->rendval = arg[1];
|
||||
|
||||
unlock(up->rgrp);
|
||||
while(p->mach != 0)
|
||||
;
|
||||
ready(p);
|
||||
unlock(up->rgrp);
|
||||
return val;
|
||||
}
|
||||
l = &p->rendhash;
|
||||
|
|
Loading…
Reference in a new issue