mirror of https://github.com/0intro/conterm
40 lines
634 B
C
40 lines
634 B
C
|
#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);
|
||
|
}
|