mirror of
https://github.com/switchbrew/libnx.git
synced 2025-07-05 19:02:14 +02:00
Add Semaphore
Implement basic semaphore, no sem_post (yet)
This commit is contained in:
parent
399a2ed21d
commit
18234cbcc3
@ -25,6 +25,7 @@ extern "C" {
|
|||||||
#include "switch/kernel/rwlock.h"
|
#include "switch/kernel/rwlock.h"
|
||||||
#include "switch/kernel/condvar.h"
|
#include "switch/kernel/condvar.h"
|
||||||
#include "switch/kernel/thread.h"
|
#include "switch/kernel/thread.h"
|
||||||
|
#include "switch/kernel/semaphore.h"
|
||||||
#include "switch/kernel/virtmem.h"
|
#include "switch/kernel/virtmem.h"
|
||||||
#include "switch/kernel/detect.h"
|
#include "switch/kernel/detect.h"
|
||||||
#include "switch/kernel/random.h"
|
#include "switch/kernel/random.h"
|
||||||
|
29
nx/include/switch/kernel/semaphore.h
Normal file
29
nx/include/switch/kernel/semaphore.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright 2018 Kevoot
|
||||||
|
|
||||||
|
#ifndef __SEMAPHORE_H
|
||||||
|
#define __SEMAPHORE_H
|
||||||
|
|
||||||
|
#include "mutex.h"
|
||||||
|
|
||||||
|
#define SEM_DOWN false
|
||||||
|
#define SEM_UP true
|
||||||
|
|
||||||
|
#define EBUSY 1
|
||||||
|
|
||||||
|
typedef struct sem_t
|
||||||
|
{
|
||||||
|
bool flag;
|
||||||
|
Mutex mutex;
|
||||||
|
} sem_t;
|
||||||
|
|
||||||
|
void sem_init(sem_t *);
|
||||||
|
void sem_uninit(sem_t *);
|
||||||
|
/* TODO */
|
||||||
|
void set_post(sem_t *);
|
||||||
|
void sem_up(sem_t *);
|
||||||
|
void sem_down(sem_t *);
|
||||||
|
void sem_wait(sem_t *);
|
||||||
|
void sem_waitup(sem_t *);
|
||||||
|
bool sem_isup(sem_t *);
|
||||||
|
|
||||||
|
#endif
|
58
nx/source/kernel/semaphore.c
Normal file
58
nx/source/kernel/semaphore.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user