57 lines
1005 B
C
57 lines
1005 B
C
|
#include <stdint.h>
|
||
|
|
||
|
#include "rtos/context.h"
|
||
|
#include "rtos/semaphore.h"
|
||
|
#include "rtos/spinlock.h"
|
||
|
|
||
|
uint8_t sem_wait(struct semaphore *sem)
|
||
|
{
|
||
|
uint32_t retval = CONTEXT_READY;
|
||
|
|
||
|
spinlock_lock(&sem->lock);
|
||
|
|
||
|
sem->count--;
|
||
|
if (sem->count < 0)
|
||
|
retval = context_wait_pri_queue(&sem->lock, &sem->sleep_queue);
|
||
|
|
||
|
spinlock_unlock(&sem->lock);
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
void sem_post(struct semaphore *sem)
|
||
|
{
|
||
|
spinlock_lock(&sem->lock);
|
||
|
|
||
|
sem->count++;
|
||
|
if (sem->count <= 0)
|
||
|
context_signal_queue(&sem->sleep_queue);
|
||
|
|
||
|
spinlock_unlock(&sem->lock);
|
||
|
}
|
||
|
|
||
|
void sem_interrupt(struct semaphore *sem, struct context *c)
|
||
|
{
|
||
|
spinlock_lock(&sem->lock);
|
||
|
context_interrupt_queue(c, &sem->sleep_queue);
|
||
|
spinlock_unlock(&sem->lock);
|
||
|
}
|
||
|
|
||
|
int32_t sem_get_count(struct semaphore *sem)
|
||
|
{
|
||
|
int32_t retval;
|
||
|
|
||
|
spinlock_lock(&sem->lock);
|
||
|
retval = sem->count;
|
||
|
spinlock_unlock(&sem->lock);
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
void sem_init(struct semaphore *sem, int32_t count)
|
||
|
{
|
||
|
sem->sleep_queue = 0;
|
||
|
spinlock_init(&sem->lock);
|
||
|
sem->count = 0;
|
||
|
}
|