From 13eb2fffea95045734361b038f35b58cdd51199c 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 a0fbd61dc..026adbcc0 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);