sam7fc/src/rtos/semaphore.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;
}