ref: 6f940b119aa42bc02b8abf5a1f0263c42f5e53d5
parent: 4c7bfb500358721949e5fb767d112622a487ba0a
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Thu Aug 11 19:02:48 EDT 2011
eqlock(): use separate lock to protect eql, fix missing unlock
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -735,7 +735,8 @@
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;
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -952,7 +952,7 @@
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;
@@ -959,10 +959,11 @@
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 @@
break;
}
unlock(&q->use);
- break;
}
- unlock(&p->rlock);
+ unlock(&p->eqlock);
break;
case Rendezvous:
/* Try and pull out of a rendezvous */
--- a/sys/src/9/port/qlock.c
+++ b/sys/src/9/port/qlock.c
@@ -54,9 +54,9 @@
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 @@
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)
--
⑨