summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-08-11 23:02:48 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-08-11 23:02:48 +0200
commite9d441fccf45995229effc5887394b01d9a8e52b (patch)
tree982fb007a2f58aeb7cc7df22755becc6e0debfe2
parent4b506cd0aebaea584af7422bddc1f8743fac5ffe (diff)
eqlock(): use separate lock to protect eql, fix missing unlock
-rw-r--r--sys/src/9/port/portdat.h3
-rw-r--r--sys/src/9/port/proc.c8
-rw-r--r--sys/src/9/port/qlock.c8
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)