xref: /plan9/sys/src/cmd/unix/drawterm/kern/rwlock.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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 Colombier rlock(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 Colombier runlock(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 Colombier wlock(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 Colombier wunlock(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