From 209e550949d2e481c9f22a412fe43f3f52b56a93 Mon Sep 17 00:00:00 2001 From: Sagar Bijwe Date: Fri, 30 Nov 2018 11:39:14 +0530 Subject: [PATCH] esp-nimble: Fix debugging assertion on mutex for freertos. When multiple threads are active, current debugging code requires owner of the mutex to be known. Mainstream code does not port these debugs for freertos. With this change the debugs are functioning as intended. --- nimble/host/src/ble_hs.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/nimble/host/src/ble_hs.c b/nimble/host/src/ble_hs.c index c73090e6a..81873f58d 100644 --- a/nimble/host/src/ble_hs.c +++ b/nimble/host/src/ble_hs.c @@ -85,8 +85,9 @@ uint16_t ble_hs_max_attrs; uint16_t ble_hs_max_services; uint16_t ble_hs_max_client_configs; -static uint8_t ble_hs_mutex_locked; #if MYNEWT_VAL(BLE_HS_DEBUG) +static uint8_t ble_hs_mutex_locked; +static TaskHandle_t ble_hs_task_handle; static uint8_t ble_hs_dbg_mutex_locked; #endif @@ -131,7 +132,7 @@ ble_hs_locked_by_cur_task(void) owner = ble_hs_mutex.mu.mu_owner; return owner != NULL && owner == os_sched_get_current_task(); #else - return ble_hs_mutex_locked; + return (ble_hs_mutex_locked && ble_hs_task_handle == xTaskGetCurrentTaskHandle()); #endif } #endif @@ -161,8 +162,12 @@ ble_hs_lock_nested(void) } #endif - ble_hs_mutex_locked = 1; rc = ble_npl_mutex_pend(&ble_hs_mutex, 0xffffffff); + +#if MYNEWT_VAL(BLE_HS_DEBUG) + ble_hs_mutex_locked = 1; + ble_hs_task_handle = xTaskGetCurrentTaskHandle(); +#endif BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED); } @@ -179,9 +184,12 @@ ble_hs_unlock_nested(void) ble_hs_dbg_mutex_locked = 0; return; } + if(ble_hs_task_handle == xTaskGetCurrentTaskHandle()) { + ble_hs_task_handle = NULL; + ble_hs_mutex_locked = 0; + } #endif - ble_hs_mutex_locked = 0; rc = ble_npl_mutex_release(&ble_hs_mutex); BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED); } @@ -192,7 +200,7 @@ ble_hs_unlock_nested(void) void ble_hs_lock(void) { - //BLE_HS_DBG_ASSERT(!ble_hs_locked_by_cur_task()); + BLE_HS_DBG_ASSERT(!ble_hs_locked_by_cur_task()); #if MYNEWT_VAL(BLE_HS_DEBUG) if (!ble_npl_os_started()) { BLE_HS_DBG_ASSERT(!ble_hs_dbg_mutex_locked);