diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/unix/drawterm/kern/rwlock.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/unix/drawterm/kern/rwlock.c')
-rwxr-xr-x | sys/src/cmd/unix/drawterm/kern/rwlock.c | 39 |
1 files changed, 39 insertions, 0 deletions
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); +} |