libnx/nx/source/kernel/rwlock.c
plutoo b7fe92f3a2 rwlock: Move over to condvar implementation. (#255)
This one is superior to the previous because it is write-preferring.
2019-03-28 23:53:04 +01:00

60 lines
1.0 KiB
C

// Copyright 2018 plutoo
#include "kernel/mutex.h"
#include "kernel/rwlock.h"
void rwlockInit(RwLock* r) {
mutexInit(&r->mutex);
condvarInit(&r->condvar_readers);
condvarInit(&r->condvar_writer);
r->readers = 0;
r->writer = false;
}
void rwlockReadLock(RwLock* r) {
mutexLock(&r->mutex);
while (r->writer) {
condvarWait(&r->condvar_writer, &r->mutex);
}
r->readers++;
mutexUnlock(&r->mutex);
}
void rwlockReadUnlock(RwLock* r) {
mutexLock(&r->mutex);
if (--r->readers == 0) {
condvarWakeAll(&r->condvar_readers);
}
mutexUnlock(&r->mutex);
}
void rwlockWriteLock(RwLock* r) {
mutexLock(&r->mutex);
while (r->writer) {
condvarWait(&r->condvar_writer, &r->mutex);
}
r->writer = true;
while (r->readers > 0) {
condvarWait(&r->condvar_readers, &r->mutex);
}
mutexUnlock(&r->mutex);
}
void rwlockWriteUnlock(RwLock* r) {
mutexLock(&r->mutex);
r->writer = false;
condvarWakeAll(&r->condvar_writer);
mutexUnlock(&r->mutex);
}