From 65d27b2d0ebce997b1706a4dde9a46d5ffc67154 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 5 Aug 2016 19:04:21 -0500 Subject: [PATCH] Moved to statically allocated Semaphores in mbed implementation Used static buffer + placement new + reinterpret cast to allow static allocation of the C++ Semaphore class in C. An assertion is used to protect against invalid size, although this should be changed to a static-assertion if available. --- equeue_mbed.cpp | 20 ++++++++++---------- equeue_sema.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/equeue_mbed.cpp b/equeue_mbed.cpp index 4c3563b..05d13b9 100644 --- a/equeue_mbed.cpp +++ b/equeue_mbed.cpp @@ -63,26 +63,26 @@ void equeue_mutex_unlock(equeue_mutex_t *m) { // Semaphore operations #ifdef MBED_CONF_RTOS_PRESENT -static inline Semaphore *sema(equeue_sema_t *s) { - return static_cast(*s); -} - int equeue_sema_create(equeue_sema_t *s) { - *s = new Semaphore(0); - return sema(s) ? 0 : -1; + MBED_ASSERT(sizeof(equeue_sema_t) >= sizeof(Semaphore)); + new (s) Semaphore(0); + return 0; } void equeue_sema_destroy(equeue_sema_t *s) { - delete sema(s); + reinterpret_cast(s)->~Semaphore(); } void equeue_sema_signal(equeue_sema_t *s) { - sema(s)->release(); + reinterpret_cast(s)->release(); } bool equeue_sema_wait(equeue_sema_t *s, int ms) { - int t = sema(s)->wait(ms < 0 ? osWaitForever : ms); - return t > 0; + if (ms < 0) { + ms = osWaitForever; + } + + return (reinterpret_cast(s)->wait(ms) > 0); } #else diff --git a/equeue_sema.h b/equeue_sema.h index 91ccd8d..80c0b60 100644 --- a/equeue_sema.h +++ b/equeue_sema.h @@ -23,7 +23,7 @@ extern "C" { typedef sem_t equeue_sema_t; #elif defined(__MBED__) #ifdef MBED_CONF_RTOS_PRESENT -typedef void *equeue_sema_t; +typedef unsigned equeue_sema_t[8]; #else typedef bool equeue_sema_t; #endif