libnx/nx/source/kernel/semaphore.c
Unknown 18234cbcc3 Add Semaphore
Implement basic semaphore, no sem_post (yet)
2018-06-26 18:49:05 -04:00

58 lines
1.0 KiB
C

// Copyright 2018 Kevoot
#include "kernel/semaphore.h"
#include "kernel/svc.h"
void _priv_sem_wait(sem_t *sem, bool flag);
void sem_down(sem_t *sem) {
mutexLock(&sem->mutex);
sem->flag = SEM_DOWN;
mutexUnlock(&sem->mutex);
}
void sem_init(sem_t *sem) {
sem->flag = SEM_DOWN;
mutexInit(&sem->mutex);
}
void sem_uninit(sem_t *sem) {
sem->flag = SEM_DOWN;
}
void sem_up(sem_t *sem) {
mutexLock(&sem->mutex);
sem->flag = SEM_UP;
mutexUnlock(&sem->mutex);
}
void sem_wait(sem_t *sem) {
_priv_sem_wait(sem, SEM_DOWN);
}
void sem_waitup(sem_t *sem) {
_priv_sem_wait(sem, SEM_UP);
}
bool sem_isup(sem_t *sem) {
bool flag;
mutexLock(&sem->mutex);
flag = sem->flag;
mutexUnlock(&sem->mutex);
return flag;
}
void _priv_sem_wait(sem_t *sem, bool flag) {
while (true) {
mutexLock(&sem->mutex);
if (sem->flag == flag) {
mutexUnlock(&sem->mutex);
break;
}
mutexUnlock(&sem->mutex);
svcSleepThread(1000000);
}
}