git: 9front

Download patch

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)
--