mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
60 lines
1.0 KiB
C
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);
|
|
}
|