diff --git a/Makefile b/Makefile index 78f1746..3ad2199 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ endif CFLAGS += -I. CFLAGS += -std=c99 CFLAGS += -Wall -CFLAGS += -D_XOPEN_SOURCE=500 +CFLAGS += -D_XOPEN_SOURCE=600 LFLAGS += -lpthread diff --git a/events_posix.c b/events_posix.c index 453fdb5..0acb72b 100644 --- a/events_posix.c +++ b/events_posix.c @@ -40,46 +40,30 @@ void events_mutex_unlock(events_mutex_t *m) { } +// Semaphore operations int events_sema_create(events_sema_t *s) { - int err = pthread_mutex_init(&s->mutex, 0); - if (err) { - return err; - } - - err = pthread_cond_init(&s->cond, 0); - if (err) { - return err; - } - - return 0; + return sem_init(s, 0, 0); } void events_sema_destroy(events_sema_t *s) { - pthread_mutex_destroy(&s->mutex); - pthread_cond_destroy(&s->cond); + sem_destroy(s); } void events_sema_release(events_sema_t *s) { - pthread_cond_signal(&s->cond); + sem_post(s); } bool events_sema_wait(events_sema_t *s, int ms) { - int err; - pthread_mutex_lock(&s->mutex); - if (ms < 0) { - err = pthread_cond_wait(&s->cond, &s->mutex); + return !sem_wait(s); } else { ms += events_tick(); struct timespec ts = { .tv_sec = ms/1000, .tv_nsec = ms*1000000, }; - err = pthread_cond_timedwait(&s->cond, &s->mutex, &ts); + return !sem_timedwait(s, &ts); } - - pthread_mutex_unlock(&s->mutex); - return !err; } #endif diff --git a/events_sema.h b/events_sema.h index 8aff327..fd4a810 100644 --- a/events_sema.h +++ b/events_sema.h @@ -19,11 +19,8 @@ extern "C" { // Optimal implementation is a binary semaphore, // however a regular semaphore is sufficient. #if defined(__unix__) -#include -typedef struct { - pthread_mutex_t mutex; - pthread_cond_t cond; -} events_sema_t; +#include +typedef sem_t events_sema_t; #elif defined(__MBED__) #ifdef MBED_CONF_RTOS_PRESENT typedef void *events_sema_t;