fix(bt): fixed mempool deinit crash issue for esp32s31

This commit is contained in:
ShenWeilong
2026-08-26 21:48:02 +08:00
parent 61aefd09ae
commit 0ed6004586
13 changed files with 133 additions and 9 deletions
@@ -355,6 +355,22 @@ void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
*/
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
/**
* @brief Deinitialize a memory pool.
*
* @param mp Pointer to memory pool
*/
void os_mempool_deinit(struct os_mempool *mp);
/**
* @brief Deinitialize all of memory pools.
*
* @param is_controller Whether called from controller.
*
* @return OS_OK on success; OS_INVALID_PARM if not found corresponding memory pools.
*/
os_error_t os_mempool_deinit_all(bool is_controller);
#else /* !CONFIG_BT_DUAL_MODE_ARCH */
#include "btdm_mempool.h"
@@ -446,6 +462,18 @@ os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags)
btdm_mempool_flags_clear((struct btdm_mempool *)mp, flags);
}
static inline void
os_mempool_deinit(struct os_mempool *mp)
{
btdm_mempool_deinit((struct btdm_mempool *)mp);
}
static inline os_error_t
os_mempool_deinit_all(bool is_controller)
{
return (os_error_t)btdm_mempool_deinit_all(is_controller);
}
#endif /* !CONFIG_BT_DUAL_MODE_ARCH */
@@ -330,12 +330,30 @@ void e_btdm_mempool_module_init(void);
#define btdm_mempool_module_init BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_module_init)
/**
* Deinitialize the memory pool module.
* Deinitialize a memory pool.
*
* @param mp Pointer to memory pool
*/
void e_btdm_mempool_deinit(struct btdm_mempool *mp);
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
/**
* Deinitialize all of memory pools.
*
* @param is_controller Whether called from controller.
*
* @return BTDM_OSAL_OK on success; BTDM_OSAL_INVALID_PARM if not found corresponding memory pools.
*/
void e_btdm_mempool_deinit(bool is_controller);
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
btdm_osal_error_t e_btdm_mempool_deinit_all(bool is_controller);
#define btdm_mempool_deinit_all BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit_all)
/**
* Check if there are any live memory pools.
*
* @return true if there are any live memory pools; false otherwise.
*/
bool e_btdm_mempool_has_live_pool(void);
#define btdm_mempool_has_live_pool BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_has_live_pool)
#ifdef __cplusplus
}
@@ -18,6 +18,11 @@ static STAILQ_HEAD(, btdm_mempool) s_btdm_osal_mempool_list = STAILQ_HEAD_INITIA
static btdm_osal_error_t
e_btdm_mempool_mem_free(struct btdm_mempool *mp)
{
/* Extended mempool has its own free logic */
if (mp->mp_flags & BTDM_MEMPOOL_F_EXT) {
return BTDM_OSAL_OK;
}
/* For runtime allocation mode, check whether all blocks have been freed */
if (!(mp->mp_flags & BTDM_MEMPOOL_F_RUNTIME)) {
return BTDM_OSAL_EINVAL;
@@ -588,8 +593,15 @@ e_btdm_mempool_module_init(void)
}
void
e_btdm_mempool_deinit(bool is_controller)
e_btdm_mempool_deinit(struct btdm_mempool *mp)
{
btdm_mempool_unregister(mp);
}
btdm_osal_error_t
e_btdm_mempool_deinit_all(bool is_controller)
{
btdm_osal_error_t err = BTDM_OSAL_INVALID_PARM;
struct btdm_mempool *mp = NULL;
struct btdm_mempool *next = NULL;
@@ -601,8 +613,17 @@ e_btdm_mempool_deinit(bool is_controller)
next = STAILQ_NEXT(mp, mp_list);
btdm_mempool_unregister(mp);
mp = next;
err = BTDM_OSAL_OK;
} else {
mp = STAILQ_NEXT(mp, mp_list);
}
}
return err;
}
bool
e_btdm_mempool_has_live_pool(void)
{
return !STAILQ_EMPTY(&s_btdm_osal_mempool_list);
}
@@ -1174,6 +1174,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
if (rc) {
return -2;
}
btdm_mempool_flags_set(&s_btdm_osal_ev_pool, BTDM_MEMPOOL_F_CONTROLLER);
}
if (elem_num->co_count) {
@@ -1190,6 +1191,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
if (rc) {
return -4;
}
btdm_mempool_flags_set(&s_btdm_osal_co_pool, BTDM_MEMPOOL_F_CONTROLLER);
}
return 0;
@@ -1200,12 +1202,15 @@ btdm_osal_elem_mempool_deinit(void)
{
if (s_btdm_osal_ev_buf) {
BTDM_OSAL_ASSERT(s_btdm_osal_ev_pool.mp_num_free == s_btdm_osal_ev_pool.mp_num_blocks);
btdm_mempool_deinit(&s_btdm_osal_ev_pool);
btdm_osal_free(s_btdm_osal_ev_buf);
s_btdm_osal_ev_buf = NULL;
}
if (s_btdm_osal_co_buf) {
BTDM_OSAL_ASSERT(s_btdm_osal_co_pool.mp_num_free == s_btdm_osal_co_pool.mp_num_blocks);
btdm_mempool_deinit(&s_btdm_osal_co_pool);
btdm_osal_free(s_btdm_osal_co_buf);
s_btdm_osal_co_buf = NULL;
}