From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/cmd/unix/drawterm/kern/rwlock.c | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 sys/src/cmd/unix/drawterm/kern/rwlock.c (limited to 'sys/src/cmd/unix/drawterm/kern/rwlock.c') diff --git a/sys/src/cmd/unix/drawterm/kern/rwlock.c b/sys/src/cmd/unix/drawterm/kern/rwlock.c new file mode 100755 index 000000000..3381957a3 --- /dev/null +++ b/sys/src/cmd/unix/drawterm/kern/rwlock.c @@ -0,0 +1,39 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +void +rlock(RWlock *l) +{ + qlock(&l->x); /* wait here for writers and exclusion */ + lock(&l->lk); + l->readers++; + canqlock(&l->k); /* block writers if we are the first reader */ + unlock(&l->lk); + qunlock(&l->x); +} + +void +runlock(RWlock *l) +{ + lock(&l->lk); + if(--l->readers == 0) /* last reader out allows writers */ + qunlock(&l->k); + unlock(&l->lk); +} + +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->k); + qunlock(&l->x); +} -- cgit v1.2.3