mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
fix(bt): fixed mempool deinit crash issue for esp32s31
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user