fix potential double ready in postnote() for rendezvous

This commit is contained in:
cinap_lenrek 2012-02-06 00:23:38 +01:00
parent 3599f733ee
commit 9d60d8262e
2 changed files with 5 additions and 7 deletions

View file

@ -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;

View file

@ -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;