Skip to content

Commit

Permalink
Adopted posix semaphore in posix implementation
Browse files Browse the repository at this point in the history
Using sem_t over posix_cond_t is a simpler implementation
of events_sema_t. The only downside is that sem_t does not
have a binary version.
  • Loading branch information
geky committed Jul 28, 2016
1 parent 2cd841c commit 418a56a
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 28 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ endif
CFLAGS += -I.
CFLAGS += -std=c99
CFLAGS += -Wall
CFLAGS += -D_XOPEN_SOURCE=500
CFLAGS += -D_XOPEN_SOURCE=600

LFLAGS += -lpthread

Expand Down
28 changes: 6 additions & 22 deletions events_posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 2 additions & 5 deletions events_sema.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ extern "C" {
// Optimal implementation is a binary semaphore,
// however a regular semaphore is sufficient.
#if defined(__unix__)
#include <pthread.h>
typedef struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
} events_sema_t;
#include <semaphore.h>
typedef sem_t events_sema_t;
#elif defined(__MBED__)
#ifdef MBED_CONF_RTOS_PRESENT
typedef void *events_sema_t;
Expand Down

0 comments on commit 418a56a

Please sign in to comment.