plan 9 kernel history: overview | file list | diff list

1995/0104/port/qlock.c (diff list | history)

1991/0428/sys/src/9/port/qlock.c:10,171991/0614/sys/src/9/port/qlock.c:10,20 (short | long)
1991/0428    
{ 
	Proc *p; 
 
	if(canlock(&q->use)) 
1991/0614    
	if(canlock(&q->use)){ 
		if(u) 
			u->p->hasspin = 0; 
1991/0428    
		return; 
1991/0614    
	} 
1991/0428    
	lock(&q->queue); 
	if(canlock(&q->use)){ 
		unlock(&q->queue); 
1991/0614/sys/src/9/port/qlock.c:10,201991/0705/sys/src/9/port/qlock.c:10,17 (short | long)
1991/0428    
{ 
	Proc *p; 
 
1991/0614    
	if(canlock(&q->use)){ 
		if(u) 
			u->p->hasspin = 0; 
1991/0705    
	if(canlock(&q->use)) 
1991/0428    
		return; 
1991/0614    
	} 
1991/0428    
	lock(&q->queue); 
	if(canlock(&q->use)){ 
		unlock(&q->queue); 
1991/0705/sys/src/9/port/qlock.c:17,221991/0711/sys/src/9/port/qlock.c:17,24 (short | long)
1991/0428    
		unlock(&q->queue); 
		return; 
	} 
1991/0711    
	if(u == 0) 
		panic("qlock"); 
1991/0428    
	p = q->tail; 
	if(p == 0) 
		q->head = u->p; 
1991/0711/sys/src/9/port/qlock.c:53,591991/0726/sys/src/9/port/qlock.c:53,62 (short | long)
1991/0428    
		unlock(&q->queue); 
		ready(p); 
	}else{ 
1991/0726    
		/* horrible botch because clock does a canqlock */ 
		int s = splhi(); 
1991/0428    
		unlock(&q->use); 
		unlock(&q->queue); 
1991/0726    
		splx(s); 
1991/0428    
	} 
} 
1991/0726/sys/src/9/port/qlock.c:53,621991/0727/sys/src/9/port/qlock.c:53,59 (short | long)
1991/0428    
		unlock(&q->queue); 
		ready(p); 
	}else{ 
1991/0726    
		/* horrible botch because clock does a canqlock */ 
		int s = splhi(); 
1991/0428    
		unlock(&q->use); 
		unlock(&q->queue); 
1991/0726    
		splx(s); 
1991/0428    
	} 
} 
1991/0727/sys/src/9/port/qlock.c:8,341991/1002/sys/src/9/port/qlock.c:8,31 (short | long)
1991/0428    
void 
qlock(QLock *q) 
{ 
	Proc *p; 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1991/0705    
	if(canlock(&q->use)) 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
		unlock(&q->use); 
1991/0428    
		return; 
	lock(&q->queue); 
	if(canlock(&q->use)){ 
		unlock(&q->queue); 
		return; 
	} 
1991/0711    
	if(u == 0) 
		panic("qlock"); 
1991/0428    
	p = q->tail; 
1991/1002    
	mp = u->p; 
1991/0428    
	if(p == 0) 
		q->head = u->p; 
1991/1002    
		q->head = mp; 
1991/0428    
	else 
		p->qnext = u->p; 
	q->tail = u->p; 
	u->p->qnext = 0; 
	u->p->state = Queueing; 
/*	u->p->qlock = q;	/* DEBUG */ 
	unlock(&q->queue); 
1991/1002    
		p->qnext = mp; 
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = Queueing; 
	unlock(&q->use); 
1991/0428    
	sched(); 
} 
 
1991/0727/sys/src/9/port/qlock.c:35,411991/1002/sys/src/9/port/qlock.c:32,45
1991/0428    
int 
canqlock(QLock *q) 
{ 
	return canlock(&q->use); 
1991/1002    
	lock(&q->use); 
	if(q->locked) { 
		unlock(&q->use); 
		return 0; 
	} 
	q->locked = 1; 
	unlock(&q->use); 
	return 1; 
1991/0428    
} 
 
void 
1991/0727/sys/src/9/port/qlock.c:43,591991/1002/sys/src/9/port/qlock.c:47,62
1991/0428    
{ 
	Proc *p; 
 
	lock(&q->queue); 
/*	u->p->qlock = 0; /* DEBUG */ 
	if(q->head){ 
		p = q->head; 
1991/1002    
	lock(&q->use); 
	p = q->head; 
	if(p) { 
1991/0428    
		q->head = p->qnext; 
		if(q->head == 0) 
			q->tail = 0; 
		unlock(&q->queue); 
		ready(p); 
	}else{ 
		unlock(&q->use); 
		unlock(&q->queue); 
1991/1002    
		ready(p); 
		return; 
1991/0428    
	} 
1991/1002    
	q->locked = 0; 
	unlock(&q->use); 
1991/0428    
} 
1991/1002/sys/src/9/port/qlock.c:60,621991/1011/sys/src/9/port/qlock.c:60,96 (short | long)
1991/1002    
	q->locked = 0; 
	unlock(&q->use); 
1991/0428    
} 
1991/1011    
 
void 
rlock(RWlock *l) 
{ 
	qlock(&l->x);		/* wait here for writers and exclusion */ 
	lock(l); 
	l->readers++; 
	canqlock(&l->k);	/* block writers if we are the first reader */ 
	unlock(l); 
	qunlock(&l->x); 
} 
 
void 
runlock(RWlock *l) 
{ 
	lock(l); 
	if(--l->readers == 0)	/* last reader out allows writers */ 
		qunlock(&l->k); 
	unlock(l); 
} 
 
void 
wlock(RWlock *l) 
{ 
	qlock(&l->x);		/* wait here for writers and exclusion */ 
	qlock(&l->k);		/* wait here for last reader */ 
} 
 
void 
wunlock(RWlock *l) 
{ 
	qunlock(&l->x); 
	qunlock(&l->k); 
} 
1991/1011/sys/src/9/port/qlock.c:33,391991/1030/sys/src/9/port/qlock.c:33,39 (short | long)
1991/0428    
canqlock(QLock *q) 
{ 
1991/1002    
	lock(&q->use); 
	if(q->locked) { 
1991/1030    
	if(q->locked){ 
1991/1002    
		unlock(&q->use); 
		return 0; 
	} 
1991/1030/sys/src/9/port/qlock.c:1,51992/0321/sys/src/9/port/qlock.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1991/0428    
#include "u.h" 
#include "lib.h" 
1992/0321    
#include "../port/lib.h" 
1991/0428    
#include "mem.h" 
#include "dat.h" 
#include "fns.h" 
1992/0321/sys/src/9/port/qlock.c:10,151992/0509/sys/src/9/port/qlock.c:10,17 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1992/0509    
	if(u) 
		u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q)); 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1992/0509/sys/src/9/port/qlock.c:39,441992/0912/sys/src/9/port/qlock.c:39,46 (short | long)
1991/1002    
		unlock(&q->use); 
		return 0; 
	} 
1992/0912    
	if(u) 
		u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q)); 
1991/1002    
	q->locked = 1; 
	unlock(&q->use); 
	return 1; 
1992/0509/sys/src/9/port/qlock.c:49,541992/0912/sys/src/9/port/qlock.c:51,58
1991/0428    
{ 
	Proc *p; 
 
1992/0912    
	if(u) 
		u->p->qlockpc = 0; 
1991/1002    
	lock(&q->use); 
	p = q->head; 
	if(p) { 
1992/0912/sys/src/9/port/qlock.c:10,171993/0501/sys/src/9/port/qlock.c:10,15 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1992/0509    
	if(u) 
		u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q)); 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1992/0912/sys/src/9/port/qlock.c:19,251993/0501/sys/src/9/port/qlock.c:17,23
1991/0428    
		return; 
	} 
	p = q->tail; 
1991/1002    
	mp = u->p; 
1993/0501    
	mp = up; 
1991/0428    
	if(p == 0) 
1991/1002    
		q->head = mp; 
1991/0428    
	else 
1992/0912/sys/src/9/port/qlock.c:39,461993/0501/sys/src/9/port/qlock.c:37,42
1991/1002    
		unlock(&q->use); 
		return 0; 
	} 
1992/0912    
	if(u) 
		u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q)); 
1991/1002    
	q->locked = 1; 
	unlock(&q->use); 
	return 1; 
1992/0912/sys/src/9/port/qlock.c:51,581993/0501/sys/src/9/port/qlock.c:47,52
1991/0428    
{ 
	Proc *p; 
 
1992/0912    
	if(u) 
		u->p->qlockpc = 0; 
1991/1002    
	lock(&q->use); 
	p = q->head; 
	if(p) { 
1993/0501/sys/src/9/port/qlock.c:32,381993/0522/sys/src/9/port/qlock.c:32,39 (short | long)
1991/0428    
int 
canqlock(QLock *q) 
{ 
1991/1002    
	lock(&q->use); 
1993/0522    
	if(!canlock(&q->use)) 
		return 0; 
1991/1030    
	if(q->locked){ 
1991/1002    
		unlock(&q->use); 
		return 0; 
1993/0522/sys/src/9/port/qlock.c:10,151994/0322/sys/src/9/port/qlock.c:10,17 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1994/0322    
if(up==0) { iprint("QLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); } 
 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1993/0522/sys/src/9/port/qlock.c:47,521994/0322/sys/src/9/port/qlock.c:49,56
1991/0428    
qunlock(QLock *q) 
{ 
	Proc *p; 
1994/0322    
 
if(up==0) { iprint("QUNLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); } 
1991/0428    
 
1991/1002    
	lock(&q->use); 
	p = q->head; 
1994/0322/sys/src/9/port/qlock.c:10,161994/0325/sys/src/9/port/qlock.c:10,16 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1994/0322    
if(up==0) { iprint("QLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); } 
1994/0325    
up->qpc =  getcallerpc(0); 
1994/0322    
 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
1994/0322/sys/src/9/port/qlock.c:34,391994/0325/sys/src/9/port/qlock.c:34,40
1991/0428    
int 
canqlock(QLock *q) 
{ 
1994/0325    
up->qpc =  getcallerpc(0); 
1993/0522    
	if(!canlock(&q->use)) 
		return 0; 
1991/1030    
	if(q->locked){ 
1994/0325/sys/src/9/port/qlock.c:10,171994/0331/sys/src/9/port/qlock.c:10,15 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1994/0325    
up->qpc =  getcallerpc(0); 
1994/0322    
                 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1994/0325/sys/src/9/port/qlock.c:34,401994/0331/sys/src/9/port/qlock.c:32,37
1991/0428    
int 
canqlock(QLock *q) 
{ 
1994/0325    
up->qpc =  getcallerpc(0); 
1993/0522    
	if(!canlock(&q->use)) 
		return 0; 
1991/1030    
	if(q->locked){ 
1994/0325/sys/src/9/port/qlock.c:50,571994/0331/sys/src/9/port/qlock.c:47,52
1991/0428    
qunlock(QLock *q) 
{ 
	Proc *p; 
1994/0322    
                 
if(up==0) { iprint("QUNLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); } 
1991/0428    
 
1991/1002    
	lock(&q->use); 
	p = q->head; 
1994/0331/sys/src/9/port/qlock.c:10,151995/0104/sys/src/9/port/qlock.c:10,17 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1995/0104    
	if((getstatus()&IE)==0) 
		print("qlock hi %lux\n", getcallerpc(q)); 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1994/0331/sys/src/9/port/qlock.c:48,531995/0104/sys/src/9/port/qlock.c:50,57
1991/0428    
{ 
	Proc *p; 
 
1995/0104    
	if((getstatus()&IE)==0) 
		print("qunlock hi %lux\n", getcallerpc(q)); 
1991/1002    
	lock(&q->use); 
	p = q->head; 
	if(p) { 
1995/0104/sys/src/9/port/qlock.c:10,171995/0126/sys/src/9/port/qlock.c:10,15 (short | long)
1991/0428    
{ 
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1995/0104    
	if((getstatus()&IE)==0) 
		print("qlock hi %lux\n", getcallerpc(q)); 
1991/1002    
	lock(&q->use); 
	if(!q->locked) { 
		q->locked = 1; 
1995/0104/sys/src/9/port/qlock.c:50,571995/0126/sys/src/9/port/qlock.c:48,53
1991/0428    
{ 
	Proc *p; 
 
1995/0104    
	if((getstatus()&IE)==0) 
		print("qunlock hi %lux\n", getcallerpc(q)); 
1991/1002    
	lock(&q->use); 
	p = q->head; 
	if(p) { 
1995/0126/sys/src/9/port/qlock.c:92,971995/1017/sys/src/9/port/qlock.c:92,97 (short | long)
1991/1011    
void 
wunlock(RWlock *l) 
{ 
	qunlock(&l->x); 
	qunlock(&l->k); 
1995/1017    
	qunlock(&l->x); 
1991/1011    
} 
1995/1017/sys/src/9/port/qlock.c:4,101997/0414/sys/src/9/port/qlock.c:4,9 (short | long)
1991/0428    
#include "dat.h" 
#include "fns.h" 
 
                 
void 
qlock(QLock *q) 
{ 
1997/0414/sys/src/9/port/qlock.c:4,91998/0325/sys/src/9/port/qlock.c:4,18 (short | long)
Add rwstats. Use longer but less lock-heavy rwlock algorithms.
rsc Fri Mar 4 12:44:25 2005
1991/0428    
#include "dat.h" 
#include "fns.h" 
 
1998/0325    
struct { 
	ulong rlock; 
	ulong rlockq; 
	ulong wlock; 
	ulong wlockq; 
	ulong qlock; 
	ulong qlockq; 
} rwstats; 
 
1991/0428    
void 
qlock(QLock *q) 
{ 
1997/0414/sys/src/9/port/qlock.c:10,201998/0325/sys/src/9/port/qlock.c:19,31
1991/1002    
	Proc *p, *mp; 
1991/0428    
 
1991/1002    
	lock(&q->use); 
1998/0325    
rwstats.qlock++; 
1991/1002    
	if(!q->locked) { 
		q->locked = 1; 
		unlock(&q->use); 
1991/0428    
		return; 
	} 
1998/0325    
rwstats.qlockq++; 
1991/0428    
	p = q->tail; 
1993/0501    
	mp = up; 
1991/0428    
	if(p == 0) 
1997/0414/sys/src/9/port/qlock.c:62,961998/0325/sys/src/9/port/qlock.c:73,192
1991/0428    
} 
1991/1011    
 
void 
rlock(RWlock *l) 
1998/0325    
rlock(RWlock *q) 
1991/1011    
{ 
	qlock(&l->x);		/* wait here for writers and exclusion */ 
	lock(l); 
	l->readers++; 
	canqlock(&l->k);	/* block writers if we are the first reader */ 
	unlock(l); 
	qunlock(&l->x); 
1998/0325    
	Proc *p, *mp; 
 
	lock(&q->use); 
rwstats.rlock++; 
	if(q->writer == 0 && q->head == nil){ 
		/* no writer, go for it */ 
		q->readers++; 
		unlock(&q->use); 
		return; 
	} 
 
rwstats.rlockq++; 
	p = q->tail; 
	mp = up; 
	if(p == 0) 
		q->head = mp; 
	else 
		p->qnext = mp; 
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = Queueing; 
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
 
void 
runlock(RWlock *l) 
1998/0325    
runlock(RWlock *q) 
1991/1011    
{ 
	lock(l); 
	if(--l->readers == 0)	/* last reader out allows writers */ 
		qunlock(&l->k); 
	unlock(l); 
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
	p = q->head; 
	if(--(q->readers) > 0 || p == nil){ 
		unlock(&q->use); 
		return; 
	} 
 
	/* start waiting writer */ 
	if(p->state != QueueingW) 
		panic("runlock"); 
	q->head = p->qnext; 
	if(q->head == 0) 
		q->tail = 0; 
	q->writer = 1; 
	unlock(&q->use); 
	ready(p); 
1991/1011    
} 
 
void 
wlock(RWlock *l) 
1998/0325    
wlock(RWlock *q) 
1991/1011    
{ 
	qlock(&l->x);		/* wait here for writers and exclusion */ 
	qlock(&l->k);		/* wait here for last reader */ 
1998/0325    
	Proc *p, *mp; 
 
	lock(&q->use); 
rwstats.wlock++; 
	if(q->readers == 0 && q->writer == 0){ 
		/* noone waiting, go for it */ 
		q->writer = 1; 
		unlock(&q->use); 
		return; 
	} 
 
	/* wait */ 
rwstats.wlockq++; 
	p = q->tail; 
	mp = up; 
	if(p == nil) 
		q->head = mp; 
	else 
		p->qnext = mp; 
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = QueueingW; 
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
 
void 
wunlock(RWlock *l) 
1998/0325    
wunlock(RWlock *q) 
1991/1011    
{ 
	qunlock(&l->k); 
1995/1017    
	qunlock(&l->x); 
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
	p = q->head; 
	if(p == nil){ 
		q->writer = 0; 
		unlock(&q->use); 
		return; 
	} 
 
	if(p->state == QueueingW){ 
		/* start waiting writer */ 
		q->head = p->qnext; 
		if(q->head == nil) 
			q->tail = nil; 
		unlock(&q->use); 
		ready(p); 
		return; 
	} 
 
	if(p->state != Queueing) 
		panic("wunlock"); 
 
	/* waken waiting readers */ 
	while(q->head != nil && q->head->state == Queueing){ 
		p = q->head; 
		q->head = p->qnext; 
		q->readers++; 
		ready(p); 
	} 
	if(q->head == nil) 
		q->tail = nil; 
	q->writer = 0; 
	unlock(&q->use); 
1991/1011    
} 
1998/0325/sys/src/9/port/qlock.c:78,861998/0805/sys/src/9/port/qlock.c:78,97 (short | long)
Debugging: pid-based tracking of RWLocks.
rsc Fri Mar 4 12:44:25 2005
1998/0325    
	Proc *p, *mp; 
 
	lock(&q->use); 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==up->pid) 
//print("***already %d\n", up->pid); 
//} 
1998/0325    
rwstats.rlock++; 
	if(q->writer == 0 && q->head == nil){ 
		/* no writer, go for it */ 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==0) { 
//q->pidr[i]=up->pid; 
//break; 
//}} 
1998/0325    
		q->readers++; 
		unlock(&q->use); 
		return; 
1998/0325/sys/src/9/port/qlock.c:96,1011998/0805/sys/src/9/port/qlock.c:107,113
1998/0325    
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = Queueing; 
1998/0805    
//print("%d rl for w%d\n", up->pid, q->pidw); 
1998/0325    
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
1998/0325/sys/src/9/port/qlock.c:106,1111998/0805/sys/src/9/port/qlock.c:118,129
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==up->pid) { 
//q->pidr[i] = 0; 
//break; 
//}} 
1998/0325    
	p = q->head; 
	if(--(q->readers) > 0 || p == nil){ 
		unlock(&q->use); 
1998/0325/sys/src/9/port/qlock.c:119,1241998/0805/sys/src/9/port/qlock.c:137,143
1998/0325    
	if(q->head == 0) 
		q->tail = 0; 
	q->writer = 1; 
1998/0805    
//q->pidw = p->pid; 
1998/0325    
	unlock(&q->use); 
	ready(p); 
1991/1011    
} 
1998/0325/sys/src/9/port/qlock.c:132,1371998/0805/sys/src/9/port/qlock.c:151,157
1998/0325    
rwstats.wlock++; 
	if(q->readers == 0 && q->writer == 0){ 
		/* noone waiting, go for it */ 
1998/0805    
//q->pidw = up->pid; 
1998/0325    
		q->writer = 1; 
		unlock(&q->use); 
		return; 
1998/0325/sys/src/9/port/qlock.c:138,1441998/0805/sys/src/9/port/qlock.c:158,164
1998/0325    
	} 
 
	/* wait */ 
rwstats.wlockq++; 
1998/0805    
//rwstats.wlockq++; 
1998/0325    
	p = q->tail; 
	mp = up; 
	if(p == nil) 
1998/0325/sys/src/9/port/qlock.c:148,1531998/0805/sys/src/9/port/qlock.c:168,181
1998/0325    
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = QueueingW; 
1998/0805    
//print("%d wl for %d%d", up->pid, q->readers, q->writer); 
//if(q->pidw) print(" w%d", q->pidw); 
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]) 
//print(" %d", q->pidr[i]); 
//print("\n"); 
//} 
1998/0325    
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
1998/0325/sys/src/9/port/qlock.c:158,1631998/0805/sys/src/9/port/qlock.c:186,194
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
1998/0805    
//if(q->pidw!=up->pid) 
//print("not qw\n"); 
//q->pidw = 0; 
1998/0325    
	p = q->head; 
	if(p == nil){ 
		q->writer = 0; 
1998/0325/sys/src/9/port/qlock.c:164,1711998/0805/sys/src/9/port/qlock.c:195,202
1998/0325    
		unlock(&q->use); 
		return; 
	} 
                 
	if(p->state == QueueingW){ 
1998/0805    
//q->pidw = p->pid; 
1998/0325    
		/* start waiting writer */ 
		q->head = p->qnext; 
		if(q->head == nil) 
1998/0325/sys/src/9/port/qlock.c:180,1851998/0805/sys/src/9/port/qlock.c:211,222
1998/0325    
 
	/* waken waiting readers */ 
	while(q->head != nil && q->head->state == Queueing){ 
1998/0805    
//{int i; 
//for(i=0;i<nelem(q->pidr); i++) 
//if(q->pidr[i]==0) { 
//q->pidr[i] = p->pid; 
//break; 
//}} 
1998/0325    
		p = q->head; 
		q->head = p->qnext; 
		q->readers++; 
1998/0805/sys/src/9/port/qlock.c:78,971998/0806/sys/src/9/port/qlock.c:78,86 (short | long)
Remove debugging.
rsc Fri Mar 4 12:44:25 2005
1998/0325    
	Proc *p, *mp; 
 
	lock(&q->use); 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==up->pid) 
//print("***already %d\n", up->pid); 
//} 
1998/0325    
rwstats.rlock++; 
	if(q->writer == 0 && q->head == nil){ 
		/* no writer, go for it */ 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==0) { 
//q->pidr[i]=up->pid; 
//break; 
//}} 
1998/0325    
		q->readers++; 
		unlock(&q->use); 
		return; 
1998/0805/sys/src/9/port/qlock.c:106,1131998/0806/sys/src/9/port/qlock.c:95,101
1998/0325    
		p->qnext = mp; 
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = Queueing; 
1998/0805    
//print("%d rl for w%d\n", up->pid, q->pidw); 
1998/0806    
	mp->state = QueueingR; 
1998/0325    
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
1998/0805/sys/src/9/port/qlock.c:118,1291998/0806/sys/src/9/port/qlock.c:106,111
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
1998/0805    
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]==up->pid) { 
//q->pidr[i] = 0; 
//break; 
//}} 
1998/0325    
	p = q->head; 
	if(--(q->readers) > 0 || p == nil){ 
		unlock(&q->use); 
1998/0805/sys/src/9/port/qlock.c:137,1431998/0806/sys/src/9/port/qlock.c:119,124
1998/0325    
	if(q->head == 0) 
		q->tail = 0; 
	q->writer = 1; 
1998/0805    
//q->pidw = p->pid; 
1998/0325    
	unlock(&q->use); 
	ready(p); 
1991/1011    
} 
1998/0805/sys/src/9/port/qlock.c:151,1571998/0806/sys/src/9/port/qlock.c:132,137
1998/0325    
rwstats.wlock++; 
	if(q->readers == 0 && q->writer == 0){ 
		/* noone waiting, go for it */ 
1998/0805    
//q->pidw = up->pid; 
1998/0325    
		q->writer = 1; 
		unlock(&q->use); 
		return; 
1998/0805/sys/src/9/port/qlock.c:158,1641998/0806/sys/src/9/port/qlock.c:138,144
1998/0325    
	} 
 
	/* wait */ 
1998/0805    
//rwstats.wlockq++; 
1998/0806    
rwstats.wlockq++; 
1998/0325    
	p = q->tail; 
	mp = up; 
	if(p == nil) 
1998/0805/sys/src/9/port/qlock.c:168,1811998/0806/sys/src/9/port/qlock.c:148,153
1998/0325    
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = QueueingW; 
1998/0805    
//print("%d wl for %d%d", up->pid, q->readers, q->writer); 
//if(q->pidw) print(" w%d", q->pidw); 
//{int i; 
//for(i=0; i<nelem(q->pidr); i++) 
//if(q->pidr[i]) 
//print(" %d", q->pidr[i]); 
//print("\n"); 
//} 
1998/0325    
	unlock(&q->use); 
	sched(); 
1991/1011    
} 
1998/0805/sys/src/9/port/qlock.c:186,1941998/0806/sys/src/9/port/qlock.c:158,163
1998/0325    
	Proc *p; 
 
	lock(&q->use); 
1998/0805    
//if(q->pidw!=up->pid) 
//print("not qw\n"); 
//q->pidw = 0; 
1998/0325    
	p = q->head; 
	if(p == nil){ 
		q->writer = 0; 
1998/0805/sys/src/9/port/qlock.c:196,2021998/0806/sys/src/9/port/qlock.c:165,170
1998/0325    
		return; 
	} 
	if(p->state == QueueingW){ 
1998/0805    
//q->pidw = p->pid; 
1998/0325    
		/* start waiting writer */ 
		q->head = p->qnext; 
		if(q->head == nil) 
1998/0805/sys/src/9/port/qlock.c:206,2221998/0806/sys/src/9/port/qlock.c:174,184
1998/0325    
		return; 
	} 
 
	if(p->state != Queueing) 
1998/0806    
	if(p->state != QueueingR) 
1998/0325    
		panic("wunlock"); 
 
	/* waken waiting readers */ 
	while(q->head != nil && q->head->state == Queueing){ 
1998/0805    
//{int i; 
//for(i=0;i<nelem(q->pidr); i++) 
//if(q->pidr[i]==0) { 
//q->pidr[i] = p->pid; 
//break; 
//}} 
1998/0806    
	while(q->head != nil && q->head->state == QueueingR){ 
1998/0325    
		p = q->head; 
		q->head = p->qnext; 
		q->readers++; 
1998/0806/sys/src/9/port/qlock.c:35,401999/0110/sys/src/9/port/qlock.c:35,41 (short | long)
1991/1002    
	q->tail = mp; 
	mp->qnext = 0; 
	mp->state = Queueing; 
1999/0110    
	up->qpc = getcallerpc(q); 
1991/1002    
	unlock(&q->use); 
1991/0428    
	sched(); 
} 
1999/0110/sys/src/9/port/qlock.c:28,331999/0124/sys/src/9/port/qlock.c:28,35 (short | long)
1998/0325    
rwstats.qlockq++; 
1991/0428    
	p = q->tail; 
1993/0501    
	mp = up; 
1999/0124    
	if(mp == nil) 
		panic("qlock"); 
1991/0428    
	if(p == 0) 
1991/1002    
		q->head = mp; 
1991/0428    
	else 
1999/0110/sys/src/9/port/qlock.c:90,951999/0124/sys/src/9/port/qlock.c:92,99
1998/0325    
rwstats.rlockq++; 
	p = q->tail; 
	mp = up; 
1999/0124    
	if(mp == nil) 
		panic("rlock"); 
1998/0325    
	if(p == 0) 
		q->head = mp; 
	else 
1999/0110/sys/src/9/port/qlock.c:142,1471999/0124/sys/src/9/port/qlock.c:146,153
1998/0806    
rwstats.wlockq++; 
1998/0325    
	p = q->tail; 
	mp = up; 
1999/0124    
	if(mp == nil) 
		panic("wlock"); 
1998/0325    
	if(p == nil) 
		q->head = mp; 
	else 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)