| plan 9 kernel history: overview | file list | diff list |
1998/0325/port/qlock.c (diff list | history)
| 1991/0428/sys/src/9/port/qlock.c:10,17 – 1991/0614/sys/src/9/port/qlock.c:10,20 (short | long) | ||
| 1991/0428 | { Proc *p; | |
| 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,20 – 1991/0705/sys/src/9/port/qlock.c:10,17 (short | long) | ||
| 1991/0428 | { Proc *p; | |
| 1991/0614 |
| |
| 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,22 – 1991/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,59 – 1991/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,62 – 1991/0727/sys/src/9/port/qlock.c:53,59 (short | long) | ||
| 1991/0428 | unlock(&q->queue); ready(p); }else{ | |
| 1991/0726 |
| |
| 1991/0428 | unlock(&q->use); unlock(&q->queue); | |
| 1991/0726 |
| |
| 1991/0428 | } } | |
| 1991/0727/sys/src/9/port/qlock.c:8,34 – 1991/1002/sys/src/9/port/qlock.c:8,31 (short | long) | ||
| 1991/0428 | void qlock(QLock *q) { | |
| 1991/1002 | Proc *p, *mp; | |
| 1991/0428 | ||
| 1991/0705 |
| |
| 1991/1002 | lock(&q->use); if(!q->locked) { q->locked = 1; unlock(&q->use); | |
| 1991/0428 | return; | |
| 1991/0711 |
| |
| 1991/0428 | p = q->tail; | |
| 1991/1002 | mp = u->p; | |
| 1991/0428 | if(p == 0) | |
| 1991/1002 | q->head = mp; | |
| 1991/0428 | else | |
| 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,41 – 1991/1002/sys/src/9/port/qlock.c:32,45 | ||
| 1991/0428 | int canqlock(QLock *q) { | |
| 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,59 – 1991/1002/sys/src/9/port/qlock.c:47,62 | ||
| 1991/0428 | { Proc *p; | |
| 1991/1002 | lock(&q->use); p = q->head; if(p) { | |
| 1991/0428 | q->head = p->qnext; if(q->head == 0) q->tail = 0; | |
| 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,62 – 1991/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,39 – 1991/1030/sys/src/9/port/qlock.c:33,39 (short | long) | ||
| 1991/0428 | canqlock(QLock *q) { | |
| 1991/1002 | lock(&q->use); | |
| 1991/1030 | if(q->locked){ | |
| 1991/1002 | unlock(&q->use); return 0; } | |
| 1991/1030/sys/src/9/port/qlock.c:1,5 – 1992/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" | |
| 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,15 – 1992/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,44 – 1992/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,54 – 1992/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,17 – 1993/0501/sys/src/9/port/qlock.c:10,15 (short | long) | ||
| 1991/0428 | { | |
| 1991/1002 | Proc *p, *mp; | |
| 1991/0428 | ||
| 1992/0509 |
| |
| 1991/1002 | lock(&q->use); if(!q->locked) { q->locked = 1; | |
| 1992/0912/sys/src/9/port/qlock.c:19,25 – 1993/0501/sys/src/9/port/qlock.c:17,23 | ||
| 1991/0428 | return; } p = q->tail; | |
| 1991/1002 |
| |
| 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,46 – 1993/0501/sys/src/9/port/qlock.c:37,42 | ||
| 1991/1002 | unlock(&q->use); return 0; } | |
| 1992/0912 |
| |
| 1991/1002 | q->locked = 1; unlock(&q->use); return 1; | |
| 1992/0912/sys/src/9/port/qlock.c:51,58 – 1993/0501/sys/src/9/port/qlock.c:47,52 | ||
| 1991/0428 | { Proc *p; | |
| 1992/0912 |
| |
| 1991/1002 | lock(&q->use); p = q->head; if(p) { | |
| 1993/0501/sys/src/9/port/qlock.c:32,38 – 1993/0522/sys/src/9/port/qlock.c:32,39 (short | long) | ||
| 1991/0428 | int canqlock(QLock *q) { | |
| 1991/1002 |
| |
| 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,15 – 1994/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,52 – 1994/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,16 – 1994/0325/sys/src/9/port/qlock.c:10,16 (short | long) | ||
| 1991/0428 | { | |
| 1991/1002 | Proc *p, *mp; | |
| 1991/0428 | ||
| 1994/0322 |
| |
| 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,39 – 1994/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,17 – 1994/0331/sys/src/9/port/qlock.c:10,15 (short | long) | ||
| 1991/0428 | { | |
| 1991/1002 | Proc *p, *mp; | |
| 1991/0428 | ||
| 1994/0325 |
| |
| 1994/0322 | ||
| 1991/1002 | lock(&q->use); if(!q->locked) { q->locked = 1; | |
| 1994/0325/sys/src/9/port/qlock.c:34,40 – 1994/0331/sys/src/9/port/qlock.c:32,37 | ||
| 1991/0428 | int canqlock(QLock *q) { | |
| 1994/0325 |
| |
| 1993/0522 | if(!canlock(&q->use)) return 0; | |
| 1991/1030 | if(q->locked){ | |
| 1994/0325/sys/src/9/port/qlock.c:50,57 – 1994/0331/sys/src/9/port/qlock.c:47,52 | ||
| 1991/0428 | qunlock(QLock *q) { Proc *p; | |
| 1994/0322 |
| |
| 1991/0428 | ||
| 1991/1002 | lock(&q->use); p = q->head; | |
| 1994/0331/sys/src/9/port/qlock.c:10,15 – 1995/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,53 – 1995/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,17 – 1995/0126/sys/src/9/port/qlock.c:10,15 (short | long) | ||
| 1991/0428 | { | |
| 1991/1002 | Proc *p, *mp; | |
| 1991/0428 | ||
| 1995/0104 |
| |
| 1991/1002 | lock(&q->use); if(!q->locked) { q->locked = 1; | |
| 1995/0104/sys/src/9/port/qlock.c:50,57 – 1995/0126/sys/src/9/port/qlock.c:48,53 | ||
| 1991/0428 | { Proc *p; | |
| 1995/0104 |
| |
| 1991/1002 | lock(&q->use); p = q->head; if(p) { | |
| 1995/0126/sys/src/9/port/qlock.c:92,97 – 1995/1017/sys/src/9/port/qlock.c:92,97 (short | long) | ||
| 1991/1011 | void wunlock(RWlock *l) { | |
| 1995/1017 | qunlock(&l->x); | |
| 1991/1011 | } | |
| 1995/1017/sys/src/9/port/qlock.c:4,10 – 1997/0414/sys/src/9/port/qlock.c:4,9 (short | long) | ||
| 1991/0428 | #include "dat.h" #include "fns.h" | |
| 1997/0414/sys/src/9/port/qlock.c:4,9 – 1998/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,20 – 1998/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,96 – 1998/0325/sys/src/9/port/qlock.c:73,192 | ||
| 1991/0428 | } | |
| 1991/1011 | void | |
| 1998/0325 | rlock(RWlock *q) | |
| 1991/1011 | { | |
| 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 | |
| 1998/0325 | runlock(RWlock *q) | |
| 1991/1011 | { | |
| 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 | |
| 1998/0325 | wlock(RWlock *q) | |
| 1991/1011 | { | |
| 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 | |
| 1998/0325 | wunlock(RWlock *q) | |
| 1991/1011 | { | |
| 1995/1017 |
| |
| 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,86 – 1998/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,101 – 1998/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,111 – 1998/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,124 – 1998/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,137 – 1998/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,144 – 1998/0805/sys/src/9/port/qlock.c:158,164 | ||
| 1998/0325 | } /* wait */ | |
| 1998/0805 | //rwstats.wlockq++; | |
| 1998/0325 | p = q->tail; mp = up; if(p == nil) | |
| 1998/0325/sys/src/9/port/qlock.c:148,153 – 1998/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,163 – 1998/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,171 – 1998/0805/sys/src/9/port/qlock.c:195,202 | ||
| 1998/0325 | unlock(&q->use); return; } | |
| 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,185 – 1998/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,97 – 1998/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 |
| |
| 1998/0325 | rwstats.rlock++; if(q->writer == 0 && q->head == nil){ /* no writer, go for it */ | |
| 1998/0805 |
| |
| 1998/0325 | q->readers++; unlock(&q->use); return; | |
| 1998/0805/sys/src/9/port/qlock.c:106,113 – 1998/0806/sys/src/9/port/qlock.c:95,101 | ||
| 1998/0325 | p->qnext = mp; q->tail = mp; mp->qnext = 0; | |
| 1998/0805 |
| |
| 1998/0806 | mp->state = QueueingR; | |
| 1998/0325 | unlock(&q->use); sched(); | |
| 1991/1011 | } | |
| 1998/0805/sys/src/9/port/qlock.c:118,129 – 1998/0806/sys/src/9/port/qlock.c:106,111 | ||
| 1998/0325 | Proc *p; lock(&q->use); | |
| 1998/0805 |
| |
| 1998/0325 | p = q->head; if(--(q->readers) > 0 || p == nil){ unlock(&q->use); | |
| 1998/0805/sys/src/9/port/qlock.c:137,143 – 1998/0806/sys/src/9/port/qlock.c:119,124 | ||
| 1998/0325 | if(q->head == 0) q->tail = 0; q->writer = 1; | |
| 1998/0805 |
| |
| 1998/0325 | unlock(&q->use); ready(p); | |
| 1991/1011 | } | |
| 1998/0805/sys/src/9/port/qlock.c:151,157 – 1998/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 |
| |
| 1998/0325 | q->writer = 1; unlock(&q->use); return; | |
| 1998/0805/sys/src/9/port/qlock.c:158,164 – 1998/0806/sys/src/9/port/qlock.c:138,144 | ||
| 1998/0325 | } /* wait */ | |
| 1998/0805 |
| |
| 1998/0806 | rwstats.wlockq++; | |
| 1998/0325 | p = q->tail; mp = up; if(p == nil) | |
| 1998/0805/sys/src/9/port/qlock.c:168,181 – 1998/0806/sys/src/9/port/qlock.c:148,153 | ||
| 1998/0325 | q->tail = mp; mp->qnext = 0; mp->state = QueueingW; | |
| 1998/0805 |
| |
| 1998/0325 | unlock(&q->use); sched(); | |
| 1991/1011 | } | |
| 1998/0805/sys/src/9/port/qlock.c:186,194 – 1998/0806/sys/src/9/port/qlock.c:158,163 | ||
| 1998/0325 | Proc *p; lock(&q->use); | |
| 1998/0805 |
| |
| 1998/0325 | p = q->head; if(p == nil){ q->writer = 0; | |
| 1998/0805/sys/src/9/port/qlock.c:196,202 – 1998/0806/sys/src/9/port/qlock.c:165,170 | ||
| 1998/0325 | return; } if(p->state == QueueingW){ | |
| 1998/0805 |
| |
| 1998/0325 | /* start waiting writer */ q->head = p->qnext; if(q->head == nil) | |
| 1998/0805/sys/src/9/port/qlock.c:206,222 – 1998/0806/sys/src/9/port/qlock.c:174,184 | ||
| 1998/0325 | return; } | |
| 1998/0806 | if(p->state != QueueingR) | |
| 1998/0325 | panic("wunlock"); /* waken waiting readers */ | |
| 1998/0805 |
| |
| 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,40 – 1999/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,33 – 1999/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,95 – 1999/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,147 – 1999/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. | ||