## diffname port/qlock.c 1991/0428
## diff -e /dev/null /n/bootesdump/1991/0428/sys/src/9/port/qlock.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
void
qlock(QLock *q)
{
Proc *p;
if(canlock(&q->use))
return;
lock(&q->queue);
if(canlock(&q->use)){
unlock(&q->queue);
return;
}
p = q->tail;
if(p == 0)
q->head = u->p;
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);
sched();
}
int
canqlock(QLock *q)
{
return canlock(&q->use);
}
void
qunlock(QLock *q)
{
Proc *p;
lock(&q->queue);
/* u->p->qlock = 0; /* DEBUG */
if(q->head){
p = q->head;
q->head = p->qnext;
if(q->head == 0)
q->tail = 0;
unlock(&q->queue);
ready(p);
}else{
unlock(&q->use);
unlock(&q->queue);
}
}
.
## diffname port/qlock.c 1991/0614
## diff -e /n/bootesdump/1991/0428/sys/src/9/port/qlock.c /n/bootesdump/1991/0614/sys/src/9/port/qlock.c
14a
}
.
13c
if(canlock(&q->use)){
if(u)
u->p->hasspin = 0;
.
## diffname port/qlock.c 1991/0705
## diff -e /n/bootesdump/1991/0614/sys/src/9/port/qlock.c /n/bootesdump/1991/0705/sys/src/9/port/qlock.c
17d
13,15c
if(canlock(&q->use))
.
## diffname port/qlock.c 1991/0711
## diff -e /n/bootesdump/1991/0705/sys/src/9/port/qlock.c /n/bootesdump/1991/0711/sys/src/9/port/qlock.c
19a
if(u == 0)
panic("qlock");
.
## diffname port/qlock.c 1991/0726
## diff -e /n/bootesdump/1991/0711/sys/src/9/port/qlock.c /n/bootesdump/1991/0726/sys/src/9/port/qlock.c
57a
splx(s);
.
55a
/* horrible botch because clock does a canqlock */
int s = splhi();
.
## diffname port/qlock.c 1991/0727
## diff -e /n/bootesdump/1991/0726/sys/src/9/port/qlock.c /n/bootesdump/1991/0727/sys/src/9/port/qlock.c
60d
56,57d
## diffname port/qlock.c 1991/1002
## diff -e /n/bootesdump/1991/0727/sys/src/9/port/qlock.c /n/bootesdump/1991/1002/sys/src/9/port/qlock.c
58a
q->locked = 0;
unlock(&q->use);
.
57c
ready(p);
return;
.
53,55d
46,49c
lock(&q->use);
p = q->head;
if(p) {
.
38c
lock(&q->use);
if(q->locked) {
unlock(&q->use);
return 0;
}
q->locked = 1;
unlock(&q->use);
return 1;
.
26,31c
p->qnext = mp;
q->tail = mp;
mp->qnext = 0;
mp->state = Queueing;
unlock(&q->use);
.
24c
q->head = mp;
.
22a
mp = u->p;
.
20,21d
15,18d
13c
lock(&q->use);
if(!q->locked) {
q->locked = 1;
unlock(&q->use);
.
11c
Proc *p, *mp;
.
## diffname port/qlock.c 1991/1011
## diff -e /n/bootesdump/1991/1002/sys/src/9/port/qlock.c /n/bootesdump/1991/1011/sys/src/9/port/qlock.c
62a
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);
}
.
## diffname port/qlock.c 1991/1030
## diff -e /n/bootesdump/1991/1011/sys/src/9/port/qlock.c /n/bootesdump/1991/1030/sys/src/9/port/qlock.c
36c
if(q->locked){
.
## diffname port/qlock.c 1992/0321
## diff -e /n/bootesdump/1991/1030/sys/src/9/port/qlock.c /n/bootesdump/1992/0321/sys/src/9/port/qlock.c
2c
#include "../port/lib.h"
.
## diffname port/qlock.c 1992/0509
## diff -e /n/bootesdump/1992/0321/sys/src/9/port/qlock.c /n/bootesdump/1992/0509/sys/src/9/port/qlock.c
12a
if(u)
u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q));
.
## diffname port/qlock.c 1992/0912
## diff -e /n/bootesdump/1992/0509/sys/src/9/port/qlock.c /n/bootesdump/1992/0912/sys/src/9/port/qlock.c
51a
if(u)
u->p->qlockpc = 0;
.
41a
if(u)
u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q));
.
## diffname port/qlock.c 1993/0501
## diff -e /n/bootesdump/1992/0912/sys/src/9/port/qlock.c /n/fornaxdump/1993/0501/sys/src/brazil/port/qlock.c
54,55d
42,43d
22c
mp = up;
.
13,14d
## diffname port/qlock.c 1993/0522
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/qlock.c /n/fornaxdump/1993/0522/sys/src/brazil/port/qlock.c
35c
if(!canlock(&q->use))
return 0;
.
## diffname port/qlock.c 1994/0322
## diff -e /n/fornaxdump/1993/0522/sys/src/brazil/port/qlock.c /n/fornaxdump/1994/0322/sys/src/brazil/port/qlock.c
49a
if(up==0) { iprint("QUNLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); }
.
12a
if(up==0) { iprint("QLOCK at ilevel PC=%lux\n", getcallerpc(0)); for(;;); }
.
## diffname port/qlock.c 1994/0325
## diff -e /n/fornaxdump/1994/0322/sys/src/brazil/port/qlock.c /n/fornaxdump/1994/0325/sys/src/brazil/port/qlock.c
36a
up->qpc = getcallerpc(0);
.
13c
up->qpc = getcallerpc(0);
.
## diffname port/qlock.c 1994/0331
## diff -e /n/fornaxdump/1994/0325/sys/src/brazil/port/qlock.c /n/fornaxdump/1994/0331/sys/src/brazil/port/qlock.c
53,54d
37d
13,14d
## diffname port/qlock.c 1995/0104
## diff -e /n/fornaxdump/1994/0331/sys/src/brazil/port/qlock.c /n/fornaxdump/1995/0104/sys/src/brazil/port/qlock.c
50a
if((getstatus()&IE)==0)
print("qunlock hi %lux\n", getcallerpc(q));
.
12a
if((getstatus()&IE)==0)
print("qlock hi %lux\n", getcallerpc(q));
.
## diffname port/qlock.c 1995/0126
## diff -e /n/fornaxdump/1995/0104/sys/src/brazil/port/qlock.c /n/fornaxdump/1995/0126/sys/src/brazil/port/qlock.c
53,54d
13,14d
## diffname port/qlock.c 1995/1017
## diff -e /n/fornaxdump/1995/0126/sys/src/brazil/port/qlock.c /n/fornaxdump/1995/1017/sys/src/brazil/port/qlock.c
96a
qunlock(&l->x);
.
95d
## diffname port/qlock.c 1997/0414
## diff -e /n/fornaxdump/1995/1017/sys/src/brazil/port/qlock.c /n/emeliedump/1997/0414/sys/src/brazil/port/qlock.c
7d
## diffname port/qlock.c 1998/0325
## diff -e /n/emeliedump/1997/0414/sys/src/brazil/port/qlock.c /n/emeliedump/1998/0325/sys/src/brazil/port/qlock.c
94,95c
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);
.
92c
wunlock(RWlock *q)
.
87,88c
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();
.
85c
wlock(RWlock *q)
.
78,81c
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);
.
76c
runlock(RWlock *q)
.
67,72c
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();
.
65c
rlock(RWlock *q)
.
17a
rwstats.qlockq++;
.
12a
rwstats.qlock++;
.
6a
struct {
ulong rlock;
ulong rlockq;
ulong wlock;
ulong wlockq;
ulong qlock;
ulong qlockq;
} rwstats;
.
## diffname port/qlock.c 1998/0805
## diff -e /n/emeliedump/1998/0325/sys/src/brazil/port/qlock.c /n/emeliedump/1998/0805/sys/src/brazil/port/qlock.c
182a
//{int i;
//for(i=0;i<nelem(q->pidr); i++)
//if(q->pidr[i]==0) {
//q->pidr[i] = p->pid;
//break;
//}}
.
168a
//q->pidw = p->pid;
.
167d
160a
//if(q->pidw!=up->pid)
//print("not qw\n");
//q->pidw = 0;
.
150a
//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");
//}
.
141c
//rwstats.wlockq++;
.
134a
//q->pidw = up->pid;
.
121a
//q->pidw = p->pid;
.
108a
//{int i;
//for(i=0; i<nelem(q->pidr); i++)
//if(q->pidr[i]==up->pid) {
//q->pidr[i] = 0;
//break;
//}}
.
98a
//print("%d rl for w%d\n", up->pid, q->pidw);
.
83a
//{int i;
//for(i=0; i<nelem(q->pidr); i++)
//if(q->pidr[i]==0) {
//q->pidr[i]=up->pid;
//break;
//}}
.
80a
//{int i;
//for(i=0; i<nelem(q->pidr); i++)
//if(q->pidr[i]==up->pid)
//print("***already %d\n", up->pid);
//}
.
## diffname port/qlock.c 1998/0806
## diff -e /n/emeliedump/1998/0805/sys/src/brazil/port/qlock.c /n/emeliedump/1998/0806/sys/src/brazil/port/qlock.c
213,219c
while(q->head != nil && q->head->state == QueueingR){
.
209c
if(p->state != QueueingR)
.
199d
189,191d
171,178d
161c
rwstats.wlockq++;
.
154d
140d
121,126d
109,110c
mp->state = QueueingR;
.
89,94d
81,85d
## diffname port/qlock.c 1999/0110
## diff -e /n/emeliedump/1998/0806/sys/src/brazil/port/qlock.c /n/emeliedump/1999/0110/sys/src/brazil/port/qlock.c
37a
up->qpc = getcallerpc(q);
.
## diffname port/qlock.c 1999/0124
## diff -e /n/emeliedump/1999/0110/sys/src/brazil/port/qlock.c /n/emeliedump/1999/0124/sys/src/brazil/port/qlock.c
144a
if(mp == nil)
panic("wlock");
.
92a
if(mp == nil)
panic("rlock");
.
30a
if(mp == nil)
panic("qlock");
.
## diffname port/qlock.c 1999/0302
## diff -e /n/emeliedump/1999/0124/sys/src/brazil/port/qlock.c /n/emeliedump/1999/0302/sys/src/brazil/port/qlock.c
198a
/* same as rlock but punts if there are any readers waiting */
int
canrlock(RWlock *q)
{
lock(&q->use);
rwstats.rlock++;
if(q->writer == 0 && q->head == nil){
/* no writer, go for it */
q->readers++;
unlock(&q->use);
return 1;
}
unlock(&q->use);
return 0;
}
.
## diffname port/qlock.c 1999/0501
## diff -e /n/emeliedump/1999/0302/sys/src/brazil/port/qlock.c /n/emeliedump/1999/0501/sys/src/brazil/port/qlock.c
40c
up->qpc = getcallerpc(&q);
.
## diffname port/qlock.c 2000/0107
## diff -e /n/emeliedump/1999/0501/sys/src/brazil/port/qlock.c /n/emeliedump/2000/0107/sys/src/9/port/qlock.c
139a
q->wpc = getcallerpc(&q);
q->wproc = up;
.
## diffname port/qlock.c 2002/0315
## diff -e /n/emeliedump/2000/0107/sys/src/9/port/qlock.c /n/emeliedump/2002/0315/sys/src/9/port/qlock.c
159a
if (isedf(mp))
edf_block(mp);
.
103a
if (isedf(mp))
edf_block(mp);
.
39a
if (isedf(mp))
edf_block(mp);
.
5a
#include "../port/edf.h"
.
## diffname port/qlock.c 2002/0320
## diff -e /n/emeliedump/2002/0315/sys/src/9/port/qlock.c /n/emeliedump/2002/0320/sys/src/9/port/qlock.c
167d
164a
unlock(&q->use);
.
109d
106a
unlock(&q->use);
.
44a
if (isedf(mp))
edf_block(mp);
.
41,42d
## diffname port/qlock.c 2002/0402
## diff -e /n/emeliedump/2002/0320/sys/src/9/port/qlock.c /n/emeliedump/2002/0402/sys/src/9/port/qlock.c
166,167d
108,109d
43,44d
6d
## diffname port/qlock.c 2002/0403
## diff -e /n/emeliedump/2002/0402/sys/src/9/port/qlock.c /n/emeliedump/2002/0403/sys/src/9/port/qlock.c
207c
rwstats.rlock++;
.
148c
rwstats.wlockq++;
.
137c
rwstats.wlock++;
.
92c
rwstats.rlockq++;
.
84c
rwstats.rlock++;
.
28c
rwstats.qlockq++;
.
22c
rwstats.qlock++;
.
## diffname port/qlock.c 2002/0404
## diff -e /n/emeliedump/2002/0403/sys/src/9/port/qlock.c /n/emeliedump/2002/0404/sys/src/9/port/qlock.c
160a
if (isedf(mp))
edf_block(mp);
.
104a
if (isedf(mp))
edf_block(mp);
.
41a
if (isedf(mp))
edf_block(mp);
.
5a
#include "../port/edf.h"
.
## diffname port/qlock.c 2002/0410
## diff -e /n/emeliedump/2002/0404/sys/src/9/port/qlock.c /n/emeliedump/2002/0410/sys/src/9/port/qlock.c
167c
edfblock(mp);
.
109c
edfblock(mp);
.
44c
edfblock(mp);
.
6d
## diffname port/qlock.c 2002/0420
## diff -e /n/emeliedump/2002/0410/sys/src/9/port/qlock.c /n/emeliedump/2002/0420/sys/src/9/port/qlock.c
42,43c
if (isedf(up))
edfblock(up);
.
36,39c
p->qnext = up;
q->tail = up;
up->qnext = 0;
up->state = Queueing;
.
34c
q->head = up;
.
30,32d
20a
if(up == 0)
panic("qlock");
if(m->ilockdepth != 0 && !shutup){
print("qlock: %lux: ilockdepth %d", getcallerpc(&q), m->ilockdepth);
shutup = 1;
}
if(up->nlocks && !shutup){
print("qlock: %lux: nlocks %d", getcallerpc(&q), up->nlocks);
shutup = 1;
}
.
19c
Proc *p;
.
15a
int shutup=1; /* RSC: you can take this out, it's just to silence a print in a loop on the dist floppy */
.
## diffname port/qlock.c 2002/0421
## diff -e /n/emeliedump/2002/0420/sys/src/9/port/qlock.c /n/emeliedump/2002/0421/sys/src/9/port/qlock.c
217c
/* same as rlock but punts if there are any writers waiting */
.
77c
if(p){
.
51c
if(isedf(up))
.
26,31c
if(up->nlocks)
print("qlock: %lux: nlocks %lud", getcallerpc(&q), up->nlocks);
.
24c
if(m->ilockdepth != 0)
.
16d
## diffname port/qlock.c 2002/0423
## diff -e /n/emeliedump/2002/0421/sys/src/9/port/qlock.c /n/emeliedump/2002/0423/sys/src/9/port/qlock.c
169,170c
if (isedf(up))
edfblock(up);
.
164,167c
p->qnext = up;
q->tail = up;
up->qnext = 0;
up->state = QueueingW;
.
162c
q->head = up;
.
158,159c
if(up == nil)
.
142c
Proc *p;
.
111,112c
if (isedf(up))
edfblock(up);
.
106,109c
p->qnext = up;
q->tail = up;
up->qnext = 0;
up->state = QueueingR;
.
104c
q->head = up;
.
100,101c
if(up == nil)
.
87c
Proc *p;
.
## diffname port/qlock.c 2002/0427
## diff -e /n/emeliedump/2002/0423/sys/src/9/port/qlock.c /n/emeliedump/2002/0427/sys/src/9/port/qlock.c
34a
if(up == 0)
panic("qlock");
.
25c
if(up != nil && up->nlocks)
.
21,22d
## diffname port/qlock.c 2002/0704
## diff -e /n/emeliedump/2002/0427/sys/src/9/port/qlock.c /n/emeliedump/2002/0704/sys/src/9/port/qlock.c
167,168c
if (edf->isedf(up))
edf->edfblock(up);
.
110,111c
if (edf->isedf(up))
edf->edfblock(up);
.
46,47c
if(edf->isedf(up))
edf->edfblock(up);
.
## diffname port/qlock.c 2003/0405
## diff -e /n/emeliedump/2002/0704/sys/src/9/port/qlock.c /n/emeliedump/2003/0405/sys/src/9/port/qlock.c
25a
if(q->use.key == 0x55555555)
panic("qlock: q %p, key 5*\n", q);
.
## diffname port/qlock.c 2003/0406
## diff -e /n/emeliedump/2003/0405/sys/src/9/port/qlock.c /n/emeliedump/2003/0406/sys/src/9/port/qlock.c
169c
if(edf->isedf(up))
.
112c
if(edf->isedf(up))
.
|