Add Semaphore

Implement basic semaphore, no sem_post (yet)
This commit is contained in:
Unknown 2018-06-25 16:32:49 -04:00 committed by Kevoot
parent 399a2ed21d
commit 18234cbcc3
3 changed files with 88 additions and 0 deletions

View File

@ -25,6 +25,7 @@ extern "C" {
#include "switch/kernel/rwlock.h"
#include "switch/kernel/condvar.h"
#include "switch/kernel/thread.h"
#include "switch/kernel/semaphore.h"
#include "switch/kernel/virtmem.h"
#include "switch/kernel/detect.h"
#include "switch/kernel/random.h"

View 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

View 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);
}
}