From 43bf393dbf13d6a877e45c890447e2693f60e8c5 Mon Sep 17 00:00:00 2001 From: h2zero <32826625+h2zero@users.noreply.github.com> Date: Sat, 11 May 2019 02:03:09 -0600 Subject: [PATCH] Fix semaphores in IDF & std::string assert (#2728) * Fix semaphores in IDF & std::string assert Fixes the problem of giving a mutex from a callback with the latest IDF. Also addresses an occasional assert that happens when the btc_task callback gives the semaphore and causes an assert due to both cores potentially writing m_owner concurrently. * Restored m_owner position in wait() as requested * Reapply assert fix and move setting m_owner in ::give() Revert previous revert commit and move setting of m_owner in ::give to before giving the semaphore to prevent race condition possibility. --- libraries/BLE/src/FreeRTOS.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libraries/BLE/src/FreeRTOS.cpp b/libraries/BLE/src/FreeRTOS.cpp index a5f5ff72..9f4c1995 100644 --- a/libraries/BLE/src/FreeRTOS.cpp +++ b/libraries/BLE/src/FreeRTOS.cpp @@ -61,15 +61,13 @@ uint32_t FreeRTOS::getTimeSinceStart() { */ uint32_t FreeRTOS::Semaphore::wait(std::string owner) { log_v(">> wait: Semaphore waiting: %s for %s", toString().c_str(), owner.c_str()); - + if (m_usePthreads) { pthread_mutex_lock(&m_pthread_mutex); } else { xSemaphoreTake(m_semaphore, portMAX_DELAY); } - m_owner = owner; - if (m_usePthreads) { pthread_mutex_unlock(&m_pthread_mutex); } else { @@ -77,7 +75,6 @@ uint32_t FreeRTOS::Semaphore::wait(std::string owner) { } log_v("<< wait: Semaphore released: %s", toString().c_str()); - m_owner = std::string(""); return m_value; } // wait @@ -87,7 +84,8 @@ FreeRTOS::Semaphore::Semaphore(std::string name) { if (m_usePthreads) { pthread_mutex_init(&m_pthread_mutex, nullptr); } else { - m_semaphore = xSemaphoreCreateMutex(); + m_semaphore = xSemaphoreCreateBinary(); + xSemaphoreGive(m_semaphore); } m_name = name; @@ -111,6 +109,8 @@ FreeRTOS::Semaphore::~Semaphore() { */ void FreeRTOS::Semaphore::give() { log_v("Semaphore giving: %s", toString().c_str()); + m_owner = std::string(""); + if (m_usePthreads) { pthread_mutex_unlock(&m_pthread_mutex); } else { @@ -120,7 +120,6 @@ void FreeRTOS::Semaphore::give() { // FreeRTOS::sleep(10); // #endif - m_owner = std::string(""); } // Semaphore::give