diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-11 23:02:48 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-11 23:02:48 +0200 |
commit | e9d441fccf45995229effc5887394b01d9a8e52b (patch) | |
tree | 982fb007a2f58aeb7cc7df22755becc6e0debfe2 | |
parent | 4b506cd0aebaea584af7422bddc1f8743fac5ffe (diff) |
eqlock(): use separate lock to protect eql, fix missing unlock
-rw-r--r-- | sys/src/9/port/portdat.h | 3 | ||||
-rw-r--r-- | sys/src/9/port/proc.c | 8 | ||||
-rw-r--r-- | sys/src/9/port/qlock.c | 8 |
3 files changed, 10 insertions, 9 deletions
diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h index 633ce28d0..bdc88153a 100644 --- a/sys/src/9/port/portdat.h +++ b/sys/src/9/port/portdat.h @@ -735,7 +735,8 @@ struct Proc int trace; /* process being traced? */ ulong qpc; /* pc calling last blocking qlock */ - QLock *eql; /* interruptable eqlock, protected by rlock */ + QLock *eql; /* interruptable eqlock */ + Lock eqlock; int setargs; diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index 2cfa6faec..25e84cd2c 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -952,17 +952,18 @@ Pullout: switch(p->state){ case Queueing: /* Try and pull out of a eqlock */ - lock(&p->rlock); + lock(&p->eqlock); if(p->state == Queueing && p->eql && p->notepending){ Proc *d, *l; QLock *q; q = p->eql; if(!canlock(&q->use)){ - unlock(&p->rlock); + unlock(&p->eqlock); sched(); goto Pullout; } + for(l = nil, d = q->head; d; l = d, d = d->qnext) if(d == p){ if(l) @@ -977,9 +978,8 @@ Pullout: break; } unlock(&q->use); - break; } - unlock(&p->rlock); + unlock(&p->eqlock); break; case Rendezvous: /* Try and pull out of a rendezvous */ diff --git a/sys/src/9/port/qlock.c b/sys/src/9/port/qlock.c index 9c0059044..d41768435 100644 --- a/sys/src/9/port/qlock.c +++ b/sys/src/9/port/qlock.c @@ -54,9 +54,9 @@ eqlock(QLock *q) up->qpc = getcallerpc(&q); up->state = Queueing; - lock(&up->rlock); + lock(&up->eqlock); up->eql = q; - unlock(&up->rlock); + unlock(&up->eqlock); unlock(&q->use); @@ -129,10 +129,10 @@ qunlock(QLock *q) p = q->head; if(p){ if(p->eql){ - lock(&p->rlock); + lock(&p->eqlock); if(p->eql == q) p->eql = 0; - unlock(&p->rlock); + unlock(&p->eqlock); } q->head = p->qnext; if(q->head == 0) |