Skip to content
This repository was archived by the owner on Aug 19, 2021. It is now read-only.

Commit 418a56a

Browse files
committed
Adopted posix semaphore in posix implementation
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.
1 parent 2cd841c commit 418a56a

File tree

3 files changed

+9
-28
lines changed

3 files changed

+9
-28
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ endif
2020
CFLAGS += -I.
2121
CFLAGS += -std=c99
2222
CFLAGS += -Wall
23-
CFLAGS += -D_XOPEN_SOURCE=500
23+
CFLAGS += -D_XOPEN_SOURCE=600
2424

2525
LFLAGS += -lpthread
2626

events_posix.c

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,46 +40,30 @@ void events_mutex_unlock(events_mutex_t *m) {
4040
}
4141

4242

43+
// Semaphore operations
4344
int events_sema_create(events_sema_t *s) {
44-
int err = pthread_mutex_init(&s->mutex, 0);
45-
if (err) {
46-
return err;
47-
}
48-
49-
err = pthread_cond_init(&s->cond, 0);
50-
if (err) {
51-
return err;
52-
}
53-
54-
return 0;
45+
return sem_init(s, 0, 0);
5546
}
5647

5748
void events_sema_destroy(events_sema_t *s) {
58-
pthread_mutex_destroy(&s->mutex);
59-
pthread_cond_destroy(&s->cond);
49+
sem_destroy(s);
6050
}
6151

6252
void events_sema_release(events_sema_t *s) {
63-
pthread_cond_signal(&s->cond);
53+
sem_post(s);
6454
}
6555

6656
bool events_sema_wait(events_sema_t *s, int ms) {
67-
int err;
68-
pthread_mutex_lock(&s->mutex);
69-
7057
if (ms < 0) {
71-
err = pthread_cond_wait(&s->cond, &s->mutex);
58+
return !sem_wait(s);
7259
} else {
7360
ms += events_tick();
7461
struct timespec ts = {
7562
.tv_sec = ms/1000,
7663
.tv_nsec = ms*1000000,
7764
};
78-
err = pthread_cond_timedwait(&s->cond, &s->mutex, &ts);
65+
return !sem_timedwait(s, &ts);
7966
}
80-
81-
pthread_mutex_unlock(&s->mutex);
82-
return !err;
8367
}
8468

8569
#endif

events_sema.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ extern "C" {
1919
// Optimal implementation is a binary semaphore,
2020
// however a regular semaphore is sufficient.
2121
#if defined(__unix__)
22-
#include <pthread.h>
23-
typedef struct {
24-
pthread_mutex_t mutex;
25-
pthread_cond_t cond;
26-
} events_sema_t;
22+
#include <semaphore.h>
23+
typedef sem_t events_sema_t;
2724
#elif defined(__MBED__)
2825
#ifdef MBED_CONF_RTOS_PRESENT
2926
typedef void *events_sema_t;

0 commit comments

Comments
 (0)