From 9be59b94b328bcebc780e4d0a19b018b4048f850 Mon Sep 17 00:00:00 2001 From: h2zero <32826625+h2zero@users.noreply.github.com> Date: Tue, 30 Apr 2019 17:21:48 -0600 Subject: [PATCH 1/3] 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. --- libraries/BLE/src/FreeRTOS.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/BLE/src/FreeRTOS.cpp b/libraries/BLE/src/FreeRTOS.cpp index a5f5ff724b5..01e82577bfe 100644 --- a/libraries/BLE/src/FreeRTOS.cpp +++ b/libraries/BLE/src/FreeRTOS.cpp @@ -62,14 +62,14 @@ 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()); + m_owner = owner; + 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 +77,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 +86,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; From 99194516ba09305927b1a98eddda7e2e27d57afe Mon Sep 17 00:00:00 2001 From: h2zero <32826625+h2zero@users.noreply.github.com> Date: Wed, 1 May 2019 12:17:29 -0600 Subject: [PATCH 2/3] Restored m_owner position in wait() as requested --- libraries/BLE/src/FreeRTOS.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/BLE/src/FreeRTOS.cpp b/libraries/BLE/src/FreeRTOS.cpp index 01e82577bfe..e1cbbc79b36 100644 --- a/libraries/BLE/src/FreeRTOS.cpp +++ b/libraries/BLE/src/FreeRTOS.cpp @@ -61,14 +61,14 @@ 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()); - - m_owner = owner; 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); @@ -77,6 +77,7 @@ 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 From 8fd7f0512044774e3d93ecf0d10fba27cf8e3752 Mon Sep 17 00:00:00 2001 From: h2zero <32826625+h2zero@users.noreply.github.com> Date: Thu, 2 May 2019 10:21:42 -0600 Subject: [PATCH 3/3] 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 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/BLE/src/FreeRTOS.cpp b/libraries/BLE/src/FreeRTOS.cpp index e1cbbc79b36..9f4c199505c 100644 --- a/libraries/BLE/src/FreeRTOS.cpp +++ b/libraries/BLE/src/FreeRTOS.cpp @@ -67,8 +67,6 @@ uint32_t FreeRTOS::Semaphore::wait(std::string owner) { } else { xSemaphoreTake(m_semaphore, portMAX_DELAY); } - - m_owner = owner; if (m_usePthreads) { pthread_mutex_unlock(&m_pthread_mutex); @@ -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 @@ -112,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 { @@ -121,7 +120,6 @@ void FreeRTOS::Semaphore::give() { // FreeRTOS::sleep(10); // #endif - m_owner = std::string(""); } // Semaphore::give