mirror of
https://github.com/switchbrew/libnx.git
synced 2025-12-30 06:48:38 +01:00
58 lines
1.0 KiB
C
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);
|
|
}
|
|
} |