1*8ccd4a63SDavid du Colombier #include "u.h" 2*8ccd4a63SDavid du Colombier #include "lib.h" 3*8ccd4a63SDavid du Colombier #include "dat.h" 4*8ccd4a63SDavid du Colombier #include "fns.h" 5*8ccd4a63SDavid du Colombier #include "error.h" 6*8ccd4a63SDavid du Colombier 7*8ccd4a63SDavid du Colombier void rlock(RWlock * l)8*8ccd4a63SDavid du Colombierrlock(RWlock *l) 9*8ccd4a63SDavid du Colombier { 10*8ccd4a63SDavid du Colombier qlock(&l->x); /* wait here for writers and exclusion */ 11*8ccd4a63SDavid du Colombier lock(&l->lk); 12*8ccd4a63SDavid du Colombier l->readers++; 13*8ccd4a63SDavid du Colombier canqlock(&l->k); /* block writers if we are the first reader */ 14*8ccd4a63SDavid du Colombier unlock(&l->lk); 15*8ccd4a63SDavid du Colombier qunlock(&l->x); 16*8ccd4a63SDavid du Colombier } 17*8ccd4a63SDavid du Colombier 18*8ccd4a63SDavid du Colombier void runlock(RWlock * l)19*8ccd4a63SDavid du Colombierrunlock(RWlock *l) 20*8ccd4a63SDavid du Colombier { 21*8ccd4a63SDavid du Colombier lock(&l->lk); 22*8ccd4a63SDavid du Colombier if(--l->readers == 0) /* last reader out allows writers */ 23*8ccd4a63SDavid du Colombier qunlock(&l->k); 24*8ccd4a63SDavid du Colombier unlock(&l->lk); 25*8ccd4a63SDavid du Colombier } 26*8ccd4a63SDavid du Colombier 27*8ccd4a63SDavid du Colombier void wlock(RWlock * l)28*8ccd4a63SDavid du Colombierwlock(RWlock *l) 29*8ccd4a63SDavid du Colombier { 30*8ccd4a63SDavid du Colombier qlock(&l->x); /* wait here for writers and exclusion */ 31*8ccd4a63SDavid du Colombier qlock(&l->k); /* wait here for last reader */ 32*8ccd4a63SDavid du Colombier } 33*8ccd4a63SDavid du Colombier 34*8ccd4a63SDavid du Colombier void wunlock(RWlock * l)35*8ccd4a63SDavid du Colombierwunlock(RWlock *l) 36*8ccd4a63SDavid du Colombier { 37*8ccd4a63SDavid du Colombier qunlock(&l->k); 38*8ccd4a63SDavid du Colombier qunlock(&l->x); 39*8ccd4a63SDavid du Colombier } 40