src.dualinventive.com/dinet/libdi-php/libdi/include/di/semaphore.h

69 lines
1.8 KiB
C
Executable File

#ifndef DI_SEMAPHORE_H__
#define DI_SEMAPHORE_H__
#include <di/types.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DI_BSEM_TIMEOUT_INFINITE 0U
#if defined(CHIBIOS_KERNEL_RT)
#include <di_fw/os.h>
typedef binary_semaphore_t di_bsem_t;
#define di_bsem_init_unlocked(sem) chBSemObjectInit(sem, false)
#define di_bsem_init_locked(sem) chBSemObjectInit(sem, true)
#define di_bsem_wait(sem) chBSemWait(sem)
di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms);
#define di_bsem_wait_from_isr(sem) chBSemWaitI(sem)
#define di_bsem_post(sem) chBSemSignal(sem)
#define di_bsem_post_from_isr(sem) chBSemSignalI(sem)
#define di_bsem_get_state(sem) chBSemGetStateI(sem)
#elif defined(CHIBIOS_KERNEL_OSLESS)
#include <stdatomic.h>
typedef atomic_bool di_bsem_t;
#define di_bsem_init_unlocked(sem) atomic_init(sem, 0)
#define di_bsem_init_locked(sem) atomic_init(sem, 1)
void di_bsem_wait(di_bsem_t *sem);
di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms);
#define di_bsem_wait_from_isr(sem) di_bsem_wait(sem)
#define di_bsem_post(sem) atomic_store(sem, 0)
#define di_bsem_post_from_isr(sem) di_bsem_post(sem)
#elif defined(__linux__)
#include <stdbool.h>
#include <pthread.h>
typedef struct {
pthread_mutex_t mtx;
pthread_cond_t cvar;
pthread_condattr_t cattr;
bool v;
} di_bsem_t;
void di_bsem_init_unlocked(di_bsem_t *sem);
void di_bsem_init_locked(di_bsem_t *sem);
di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms);
void di_bsem_wait(di_bsem_t *sem);
#define di_bsem_wait_from_isr(sem) di_bsem_wait(sem)
void di_bsem_post(di_bsem_t *sem);
#define di_bsem_post_from_isr(sem) di_bsem_post(sem)
#else
#error No sempahore implementation for this platform
#endif
#ifdef __cplusplus
}
#endif
#endif /** DI_SEMAPHORE_H__ */