refactor[mpp_mem_pool]: Add exit leak pool print

1. Refactor caller parameter on pool functions.
2. Add name on pool init.
3. Add exit leak pool print.

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I39a8a966db895340a9e01ddff3a7894f1ca4b825
This commit is contained in:
Herman Chen
2025-06-16 16:49:50 +08:00
parent ed3995dc32
commit e31839cc74
17 changed files with 100 additions and 96 deletions

View File

@@ -440,7 +440,7 @@ rk_s32 kmpp_objdef_put(KmppObjDef def)
impl->trie = NULL;
}
if (impl->pool) {
mpp_mem_pool_deinit(impl->pool);
mpp_mem_pool_deinit_f(impl->pool);
impl->pool = NULL;
}
mpp_free(impl);
@@ -548,7 +548,7 @@ rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl)
obj_dbg_entry("objdef %-16s entry size %4d buf size %4d -> %4d\n", impl->name,
impl->entry_size, old_size, impl->buf_size);
impl->pool = mpp_mem_pool_init(impl->buf_size);
impl->pool = mpp_mem_pool_init_f(impl->name, impl->buf_size);
if (!impl->pool) {
mpp_loge_f("get mem pool size %d failed\n", impl->buf_size);
ret = rk_nok;
@@ -795,7 +795,7 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
/* userspace objdef path */
if (def_impl->buf_size) {
if (def_impl->pool)
impl = mpp_mem_pool_get_f(caller, def_impl->pool);
impl = mpp_mem_pool_get(def_impl->pool, caller);
else
impl = mpp_calloc_size(KmppObjImpl, def_impl->buf_size);
@@ -975,7 +975,7 @@ rk_s32 kmpp_obj_put(KmppObj obj, const char *caller)
def->deinit(impl->entry, caller);
if (def->pool) {
mpp_mem_pool_put_f(caller, def->pool, impl);
mpp_mem_pool_put(def->pool, impl, caller);
return rk_ok;
}
}

View File

@@ -121,9 +121,9 @@ static const char *ops2str[BUF_OPS_BUTT] = {
"buf destroy",
};
static MppMemPool mpp_buffer_pool = mpp_mem_pool_init_f(MODULE_TAG, sizeof(MppBufferImpl));
static MppMemPool mpp_buf_grp_pool = mpp_mem_pool_init_f("mpp_buf_grp", sizeof(MppBufferGroupImpl));
static MppMemPool mpp_buf_map_node_pool = mpp_mem_pool_init_f("mpp_buf_map_node", sizeof(MppDevBufMapNode));
static MppMemPool mpp_buffer_pool = mpp_mem_pool_init(MODULE_TAG, sizeof(MppBufferImpl), NULL);
static MppMemPool mpp_buf_grp_pool = mpp_mem_pool_init("mpp_buf_grp", sizeof(MppBufferGroupImpl), NULL);
static MppMemPool mpp_buf_map_node_pool = mpp_mem_pool_init("mpp_buf_map_node", sizeof(MppDevBufMapNode), NULL);
RK_U32 mpp_buffer_debug = 0;
@@ -322,7 +322,7 @@ static MPP_RET put_buffer(MppBufferGroupImpl *group, MppBufferImpl *buffer,
/* remove buffer from group */
mpp_dev_ioctl(dev, MPP_DEV_DETACH_FD, pos);
mpp_dev_ioctl(dev, MPP_DEV_UNLOCK_MAP, NULL);
mpp_mem_pool_put_f(caller, mpp_buf_map_node_pool, pos);
mpp_mem_pool_put(mpp_buf_map_node_pool, pos, caller);
}
/* release buffer here */
@@ -332,7 +332,7 @@ static MPP_RET put_buffer(MppBufferGroupImpl *group, MppBufferImpl *buffer,
func(buffer->allocator, &info);
mpp_mem_pool_put_f(caller, mpp_buffer_pool, buffer);
mpp_mem_pool_put(mpp_buffer_pool, buffer, caller);
return MPP_OK;
}
@@ -409,7 +409,7 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller,
goto RET;
}
p = (MppBufferImpl *)mpp_mem_pool_get_f(caller, mpp_buffer_pool);
p = (MppBufferImpl *)mpp_mem_pool_get(mpp_buffer_pool, caller);
if (NULL == p) {
mpp_err_f("failed to allocate context\n");
ret = MPP_ERR_MALLOC;
@@ -421,7 +421,7 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller,
ret = func(group->allocator, info);
if (ret) {
mpp_err_f("failed to create buffer with size %d\n", info->size);
mpp_mem_pool_put_f(caller, mpp_buffer_pool, p);
mpp_mem_pool_put(mpp_buffer_pool, p, caller);
ret = MPP_ERR_MALLOC;
goto RET;
}
@@ -674,7 +674,7 @@ static MppDevBufMapNode *mpp_buffer_attach_dev_lock(const char *caller, MppBuffe
}
}
node = (MppDevBufMapNode *)mpp_mem_pool_get_f(caller, mpp_buf_map_node_pool);
node = (MppDevBufMapNode *)mpp_mem_pool_get(mpp_buf_map_node_pool, caller);
if (!node) {
mpp_err("mpp_buffer_attach_dev failed to allocate map node\n");
ret = MPP_NOK;
@@ -691,7 +691,7 @@ static MppDevBufMapNode *mpp_buffer_attach_dev_lock(const char *caller, MppBuffe
ret = mpp_dev_ioctl(dev, MPP_DEV_ATTACH_FD, node);
if (ret) {
mpp_mem_pool_put_f(caller, mpp_buf_map_node_pool, node);
mpp_mem_pool_put(mpp_buf_map_node_pool, node, caller);
node = NULL;
goto DONE;
}
@@ -725,7 +725,7 @@ MPP_RET mpp_buffer_detach_dev_f(const char *caller, MppBuffer buffer, MppDev dev
if (pos->dev == dev) {
list_del_init(&pos->list_buf);
ret = mpp_dev_ioctl(dev, MPP_DEV_DETACH_FD, pos);
mpp_mem_pool_put_f(caller, mpp_buf_map_node_pool, pos);
mpp_mem_pool_put(mpp_buf_map_node_pool, pos, caller);
break;
}
}
@@ -1043,7 +1043,7 @@ MppBufferGroupImpl *MppBufferService::get_group(const char *tag, const char *cal
return NULL;
}
p = (MppBufferGroupImpl *)mpp_mem_pool_get_f(caller, mpp_buf_grp_pool);
p = (MppBufferGroupImpl *)mpp_mem_pool_get(mpp_buf_grp_pool, caller);
if (!p) {
mpp_err("MppBufferService failed to allocate group context\n");
return NULL;
@@ -1078,7 +1078,7 @@ MppBufferGroupImpl *MppBufferService::get_group(const char *tag, const char *cal
}
if (!p->allocator || !p->alloc_api) {
mpp_mem_pool_put_f(caller, mpp_buf_grp_pool, p);
mpp_mem_pool_put(mpp_buf_grp_pool, p, caller);
mpp_err("MppBufferService get_group failed to get allocater with mode %d type %x\n", mode, type);
return NULL;
}
@@ -1231,7 +1231,7 @@ void MppBufferService::destroy_group(MppBufferGroupImpl *group)
buf_logs_deinit(group->logs);
group->logs = NULL;
}
mpp_mem_pool_put(mpp_buf_grp_pool, group);
mpp_mem_pool_put_f(mpp_buf_grp_pool, group);
group_count--;
if (id == misc[mode][type][flag]) {

View File

@@ -26,7 +26,7 @@
#include "mpp_mem_pool.h"
static const char *module_name = MODULE_TAG;
static MppMemPool mpp_frame_pool = mpp_mem_pool_init_f(module_name, sizeof(MppFrameImpl));
static MppMemPool mpp_frame_pool = mpp_mem_pool_init(module_name, sizeof(MppFrameImpl), NULL);
static void setup_mpp_frame_name(MppFrameImpl *frame)
{
@@ -60,7 +60,7 @@ MPP_RET mpp_frame_init(MppFrame *frame)
return MPP_ERR_NULL_PTR;
}
MppFrameImpl *p = (MppFrameImpl*)mpp_mem_pool_get(mpp_frame_pool);
MppFrameImpl *p = (MppFrameImpl*)mpp_mem_pool_get_f(mpp_frame_pool);
if (NULL == p) {
mpp_err_f("malloc failed\n");
return MPP_ERR_NULL_PTR;
@@ -90,7 +90,7 @@ MPP_RET mpp_frame_deinit(MppFrame *frame)
if (p->stopwatch)
mpp_stopwatch_put(p->stopwatch);
mpp_mem_pool_put(mpp_frame_pool, *frame);
mpp_mem_pool_put_f(mpp_frame_pool, *frame);
*frame = NULL;
return MPP_OK;
}

View File

@@ -24,7 +24,7 @@
#include "mpp_meta_impl.h"
static const char *module_name = MODULE_TAG;
static MppMemPool mpp_packet_pool = mpp_mem_pool_init_f(module_name, sizeof(MppPacketImpl));
static MppMemPool mpp_packet_pool = mpp_mem_pool_init(module_name, sizeof(MppPacketImpl), NULL);
#define setup_mpp_packet_name(packet) \
((MppPacketImpl*)packet)->name = module_name;
@@ -46,7 +46,7 @@ MPP_RET mpp_packet_new(MppPacket *packet)
return MPP_ERR_NULL_PTR;
}
MppPacketImpl *p = (MppPacketImpl*)mpp_mem_pool_get(mpp_packet_pool);
MppPacketImpl *p = (MppPacketImpl*)mpp_mem_pool_get_f(mpp_packet_pool);
*packet = p;
if (NULL == p) {
mpp_err_f("malloc failed\n");
@@ -181,7 +181,7 @@ MPP_RET mpp_packet_deinit(MppPacket *packet)
if (p->release)
p->release(p->release_ctx, p->release_arg);
mpp_mem_pool_put(mpp_packet_pool, *packet);
mpp_mem_pool_put_f(mpp_packet_pool, *packet);
*packet = NULL;
return MPP_OK;
}

View File

@@ -41,7 +41,7 @@
#define SYS_CFG_CNT 3
RK_U32 mpp_sys_cfg_debug = 0;
static MppMemPool mpp_sys_cfg_pool = mpp_mem_pool_init_f(MODULE_TAG, sizeof(MppSysCfgSet));
static MppMemPool mpp_sys_cfg_pool = mpp_mem_pool_init(MODULE_TAG, sizeof(MppSysCfgSet), NULL);
class MppSysCfgService
{
@@ -145,7 +145,7 @@ MppSysCfgSet *MppSysCfgService::get_cfg()
{
MppSysCfgSet *node;
node = (MppSysCfgSet*)mpp_mem_pool_get(mpp_sys_cfg_pool);
node = (MppSysCfgSet*)mpp_mem_pool_get_f(mpp_sys_cfg_pool);
node->dec_buf_chk.type = MPP_VIDEO_CodingUnused;
return node;
@@ -153,7 +153,7 @@ MppSysCfgSet *MppSysCfgService::get_cfg()
MPP_RET MppSysCfgService::put_cfg(MppSysCfgSet *node)
{
mpp_mem_pool_put(mpp_sys_cfg_pool, node);
mpp_mem_pool_put_f(mpp_sys_cfg_pool, node);
return MPP_OK;
}

View File

@@ -159,7 +159,7 @@ static MPP_RET free_vid_ctx(H264dVideoCtx_t *p_Vid)
free_storable_picture(p_Vid->p_Dec, p_Vid->dec_pic);
if (p_Vid->pic_st) {
mpp_mem_pool_deinit(p_Vid->pic_st);
mpp_mem_pool_deinit_f(p_Vid->pic_st);
p_Vid->pic_st = NULL;
}
@@ -187,7 +187,7 @@ static MPP_RET init_vid_ctx(H264dVideoCtx_t *p_Vid)
p_Vid->active_subsps = NULL;
p_Vid->active_sps_id[0] = -1;
p_Vid->active_sps_id[1] = -1;
p_Vid->pic_st = mpp_mem_pool_init(sizeof(H264_StorePic_t));
p_Vid->pic_st = mpp_mem_pool_init_f("h264d_pic_st", sizeof(H264_StorePic_t));
__RETURN:
return ret = MPP_OK;
__FAILED:

View File

@@ -1216,8 +1216,8 @@ static MPP_RET dpb_split_field(H264dVideoCtx_t *p_Vid, H264_FrameStore_t *fs)
}
return ret = MPP_OK;
__FAILED:
mpp_mem_pool_put(p_Vid->pic_st, fs->top_field);
mpp_mem_pool_put(p_Vid->pic_st, fs->bottom_field);
mpp_mem_pool_put_f(p_Vid->pic_st, fs->top_field);
mpp_mem_pool_put_f(p_Vid->pic_st, fs->bottom_field);
fs->top_field = NULL;
fs->bottom_field = NULL;
return ret;
@@ -1796,7 +1796,7 @@ void free_storable_picture(H264_DecCtx_t *p_Dec, H264_StorePic_t *p)
if (p->mem_malloc_type == Mem_BotOnly) {
free_dpb_mark(p_Dec, p->mem_mark, BOTTOM_FIELD);
}
mpp_mem_pool_put(p_Dec->p_Vid->pic_st, p);
mpp_mem_pool_put_f(p_Dec->p_Vid->pic_st, p);
}
}
@@ -1810,7 +1810,7 @@ void free_storable_picture(H264_DecCtx_t *p_Dec, H264_StorePic_t *p)
H264_StorePic_t *alloc_storable_picture(H264dVideoCtx_t *p_Vid, RK_S32 structure)
{
MPP_RET ret = MPP_ERR_UNKNOW;
H264_StorePic_t *s = mpp_mem_pool_get(p_Vid->pic_st);
H264_StorePic_t *s = mpp_mem_pool_get_f(p_Vid->pic_st);
MEM_CHECK(ret, s);
s->view_id = -1;

View File

@@ -736,7 +736,7 @@ static MPP_RET alloc_decpic(H264_SLICE_t *currSlice)
return ret = MPP_OK;
__FAILED:
mpp_mem_pool_put(p_Vid->pic_st, dec_pic);
mpp_mem_pool_put_f(p_Vid->pic_st, dec_pic);
p_Vid->dec_pic = NULL;
return ret;

View File

@@ -2080,11 +2080,11 @@ MPP_RET h265d_deinit(void *ctx)
for (i = 0; i < MAX_VPS_COUNT; i++) {
if (s->vps_list[i])
mpp_mem_pool_put(s->vps_pool, s->vps_list[i]);
mpp_mem_pool_put_f(s->vps_pool, s->vps_list[i]);
}
for (i = 0; i < MAX_SPS_COUNT; i++) {
if (s->sps_list[i])
mpp_mem_pool_put(s->sps_pool, s->sps_list[i]);
mpp_mem_pool_put_f(s->sps_pool, s->sps_list[i]);
}
for (i = 0; i < MAX_PPS_COUNT; i++)
mpp_hevc_pps_free(s->pps_list[i]);
@@ -2117,9 +2117,9 @@ MPP_RET h265d_deinit(void *ctx)
}
if (s->vps_pool)
mpp_mem_pool_deinit(s->vps_pool);
mpp_mem_pool_deinit_f(s->vps_pool);
if (s->sps_pool)
mpp_mem_pool_deinit(s->sps_pool);
mpp_mem_pool_deinit_f(s->sps_pool);
MPP_FREE((s->hdr_dynamic_meta));
@@ -2251,8 +2251,8 @@ MPP_RET h265d_init(void *ctx, ParserCfg *parser_cfg)
s->pre_pps_id = -1;
s->vps_pool = mpp_mem_pool_init(sizeof(HEVCVPS));
s->sps_pool = mpp_mem_pool_init(sizeof(HEVCSPS));
s->vps_pool = mpp_mem_pool_init_f("h264d_vps", sizeof(HEVCVPS));
s->sps_pool = mpp_mem_pool_init_f("h265d_sps", sizeof(HEVCSPS));
mpp_slots_set_prop(s->slots, SLOTS_WIDTH_ALIGN, rkv_ctu_64_align);

View File

@@ -1042,7 +1042,7 @@ int mpp_hevc_decode_nal_vps(HEVCContext *s)
BitReadCtx_t *gb = &s->HEVClc->gb;
RK_U32 vps_id = 0;
HEVCVPS *vps = NULL;
RK_U8 *vps_buf = mpp_mem_pool_get(s->vps_pool);
RK_U8 *vps_buf = mpp_mem_pool_get_f(s->vps_pool);
RK_S32 value = 0;
if (!vps_buf)
@@ -1158,10 +1158,10 @@ int mpp_hevc_decode_nal_vps(HEVCContext *s)
if (s->vps_list[vps_id] &&
!memcmp(s->vps_list[vps_id], vps_buf, sizeof(HEVCVPS))) {
mpp_mem_pool_put(s->vps_pool, vps_buf);
mpp_mem_pool_put_f(s->vps_pool, vps_buf);
} else {
if (s->vps_list[vps_id] != NULL) {
mpp_mem_pool_put(s->vps_pool, s->vps_list[vps_id]);
mpp_mem_pool_put_f(s->vps_pool, s->vps_list[vps_id]);
}
s->vps_list[vps_id] = vps_buf;
s->ps_need_upate = 1;
@@ -1170,7 +1170,7 @@ int mpp_hevc_decode_nal_vps(HEVCContext *s)
return 0;
__BITREAD_ERR:
err:
mpp_mem_pool_put(s->vps_pool, vps_buf);
mpp_mem_pool_put_f(s->vps_pool, vps_buf);
return MPP_ERR_STREAM;
}
@@ -1421,7 +1421,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
RK_S32 value = 0;
HEVCSPS *sps;
RK_U8 *sps_buf = mpp_mem_pool_get(s->sps_pool);
RK_U8 *sps_buf = mpp_mem_pool_get_f(s->sps_pool);
if (!sps_buf)
return MPP_ERR_NOMEM;
@@ -1886,7 +1886,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
*/
if (s->sps_list[sps_id] &&
!memcmp(s->sps_list[sps_id], sps_buf, sizeof(HEVCSPS))) {
mpp_mem_pool_put(s->sps_pool, sps_buf);
mpp_mem_pool_put_f(s->sps_pool, sps_buf);
} else {
for (i = 0; (RK_U32)i < MPP_ARRAY_ELEMS(s->pps_list); i++) {
if (s->pps_list[i] && ((HEVCPPS*)s->pps_list[i])->sps_id == sps_id) {
@@ -1895,7 +1895,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
}
}
if (s->sps_list[sps_id] != NULL)
mpp_mem_pool_put(s->sps_pool, s->sps_list[sps_id]);
mpp_mem_pool_put_f(s->sps_pool, s->sps_list[sps_id]);
s->sps_list[sps_id] = sps_buf;
s->sps_need_upate = 1;
}
@@ -1907,7 +1907,7 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
__BITREAD_ERR:
ret = MPP_ERR_STREAM;
err:
mpp_mem_pool_put(s->sps_pool, sps_buf);
mpp_mem_pool_put_f(s->sps_pool, sps_buf);
return ret;
}

View File

@@ -308,7 +308,7 @@ void mpp_dec_put_frame(Mpp *mpp, RK_S32 index, HalDecTaskFlag flags)
if (pkt_ts) {
mpp_frame_set_dts(frame, pkt_ts->dts);
mpp_frame_set_pts(frame, pkt_ts->pts);
mpp_mem_pool_put(dec->ts_pool, pkt_ts);
mpp_mem_pool_put_f(dec->ts_pool, pkt_ts);
}
}
}
@@ -677,7 +677,7 @@ MPP_RET mpp_dec_init(MppDec *dec, MppDecInitCfg *cfg)
// init timestamp for record and sort pts
mpp_spinlock_init(&p->ts_lock);
INIT_LIST_HEAD(&p->ts_link);
p->ts_pool = mpp_mem_pool_init(sizeof(MppPktTs));
p->ts_pool = mpp_mem_pool_init_f("ts_pool", sizeof(MppPktTs));
if (!p->ts_pool) {
mpp_err_f("malloc ts pool failed!\n");
break;
@@ -770,7 +770,7 @@ MPP_RET mpp_dec_deinit(MppDec ctx)
sem_destroy(&dec->cmd_done);
if (dec->ts_pool) {
mpp_mem_pool_deinit(dec->ts_pool);
mpp_mem_pool_deinit_f(dec->ts_pool);
dec->ts_pool = NULL;
}

View File

@@ -209,7 +209,7 @@ static RK_U32 reset_parser_thread(Mpp *mpp, DecTask *task)
mpp_spinlock_lock(&dec->ts_lock);
list_for_each_entry_safe(ts, pos, &dec->ts_link, MppPktTs, link) {
list_del_init(&ts->link);
mpp_mem_pool_put(dec->ts_pool, ts);
mpp_mem_pool_put_f(dec->ts_pool, ts);
}
mpp_spinlock_unlock(&dec->ts_lock);
}
@@ -648,7 +648,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
if (dec->cfg->base.sort_pts) {
MppFrame frame = NULL;
MppPktTs *pkt_ts = (MppPktTs *)mpp_mem_pool_get(dec->ts_pool);
MppPktTs *pkt_ts = (MppPktTs *)mpp_mem_pool_get_f(dec->ts_pool);
mpp_assert(pkt_ts);
mpp_buf_slot_get_prop(frame_slots, output, SLOT_FRAME_PTR, &frame);

View File

@@ -201,7 +201,7 @@ static void batch_reset(MppDevBatTask *batch)
MppDevBatTask *batch_add(MppDevBatServ *server)
{
MppDevBatTask *batch = (MppDevBatTask *)mpp_mem_pool_get(server->batch_pool);
MppDevBatTask *batch = (MppDevBatTask *)mpp_mem_pool_get_f(server->batch_pool);
mpp_assert(batch);
if (!batch)
@@ -232,7 +232,7 @@ void batch_del(MppDevBatServ *server, MppDevBatTask *batch)
list_del_init(&batch->link_server);
mpp_mem_pool_put(server->batch_pool, batch);
mpp_mem_pool_put_f(server->batch_pool, batch);
server->batch_free--;
mpp_serv_dbg_flow("batch del free count %d:%d\n", server->batch_run, server->batch_free);
}
@@ -697,7 +697,7 @@ static rk_s32 server_attach(MppDevServer *srv, MppDevMppService *ctx)
return rk_ok;
}
session = (MppDevSession *)mpp_mem_pool_get(srv->session_pool);
session = (MppDevSession *)mpp_mem_pool_get_f(srv->session_pool);
INIT_LIST_HEAD(&session->list_server);
INIT_LIST_HEAD(&session->list_wait);
@@ -770,7 +770,7 @@ static rk_s32 server_detach(MppDevServer *srv, MppDevMppService *ctx)
mpp_mutex_cond_destroy(&session->cond_lock);
mpp_mem_pool_put(srv->session_pool, session);
mpp_mem_pool_put_f(srv->session_pool, session);
server->batch_max_count++;
server->session_count++;
@@ -783,12 +783,12 @@ static void server_clear(MppDevServer *srv)
{
if (srv) {
if (srv->session_pool) {
mpp_mem_pool_deinit(srv->session_pool);
mpp_mem_pool_deinit_f(srv->session_pool);
srv->session_pool = NULL;
}
if (srv->batch_pool) {
mpp_mem_pool_deinit(srv->batch_pool);
mpp_mem_pool_deinit_f(srv->batch_pool);
srv->batch_pool = NULL;
}
@@ -850,13 +850,13 @@ static void mpp_server_init()
break;
}
srv->session_pool = mpp_mem_pool_init(sizeof(MppDevSession));
srv->session_pool = mpp_mem_pool_init_f("server_session", sizeof(MppDevSession));
if (!srv->session_pool) {
srv->server_error = "create session pool failed";
break;
}
srv->batch_pool = mpp_mem_pool_init(batch_task_size);
srv->batch_pool = mpp_mem_pool_init_f("server_batch", batch_task_size);
if (!srv->batch_pool) {
srv->server_error = "create batch tack pool failed";
break;

View File

@@ -399,7 +399,7 @@ MPP_RET mpp_service_deinit(void *ctx)
pos->lock_buf = NULL;
pos->lock_dev = NULL;
mpp_service_ioc_detach_fd(pos);
mpp_mem_pool_put_f(__FUNCTION__, pos->pool, pos);
mpp_mem_pool_put_f(pos->pool, pos);
pthread_mutex_unlock(lock_buf);
}

View File

@@ -14,17 +14,17 @@ typedef void* MppMemPool;
extern "C" {
#endif
#define mpp_mem_pool_init(size) mpp_mem_pool_init_f(__FUNCTION__, size)
#define mpp_mem_pool_deinit(pool) mpp_mem_pool_deinit_f(__FUNCTION__, pool);
#define mpp_mem_pool_init_f(name, size) mpp_mem_pool_init(name, size, __FUNCTION__)
#define mpp_mem_pool_deinit_f(pool) mpp_mem_pool_deinit(pool, __FUNCTION__);
#define mpp_mem_pool_get(pool) mpp_mem_pool_get_f(__FUNCTION__, pool)
#define mpp_mem_pool_put(pool, p) mpp_mem_pool_put_f(__FUNCTION__, pool, p)
#define mpp_mem_pool_get_f(pool) mpp_mem_pool_get(pool, __FUNCTION__)
#define mpp_mem_pool_put_f(pool, p) mpp_mem_pool_put(pool, p, __FUNCTION__)
MppMemPool mpp_mem_pool_init_f(const char *caller, size_t size);
void mpp_mem_pool_deinit_f(const char *caller, MppMemPool pool);
MppMemPool mpp_mem_pool_init(const char *name, size_t size, const char *caller);
void mpp_mem_pool_deinit(MppMemPool pool, const char *caller);
void *mpp_mem_pool_get_f(const char *caller, MppMemPool pool);
void mpp_mem_pool_put_f(const char *caller, MppMemPool pool, void *p);
void *mpp_mem_pool_get(MppMemPool pool, const char *caller);
void mpp_mem_pool_put(MppMemPool pool, void *p, const char *caller);
#ifdef __cplusplus
}

View File

@@ -15,12 +15,14 @@
#include "mpp_mem_pool.h"
#define MPP_MEM_POOL_DBG_FLOW (0x00000001)
#define MEM_POOL_DBG_FLOW (0x00000001)
#define MEM_POOL_DBG_EXIT (0x00000002)
#define mem_pool_dbg(flag, fmt, ...) _mpp_dbg(mpp_mem_pool_debug, flag, fmt, ## __VA_ARGS__)
#define mem_pool_dbg_f(flag, fmt, ...) _mpp_dbg_f(mpp_mem_pool_debug, flag, fmt, ## __VA_ARGS__)
#define mem_pool_dbg_flow(fmt, ...) mem_pool_dbg(MPP_MEM_POOL_DBG_FLOW, fmt, ## __VA_ARGS__)
#define mem_pool_dbg_flow(fmt, ...) mem_pool_dbg(MEM_POOL_DBG_FLOW, fmt, ## __VA_ARGS__)
#define mem_pool_dbg_exit(fmt, ...) mem_pool_dbg(MEM_POOL_DBG_EXIT, fmt, ## __VA_ARGS__)
#define get_srv_mem_pool(caller) \
({ \
@@ -37,7 +39,7 @@
__tmp; \
})
rk_u32 mpp_mem_pool_debug = 0;
static rk_u32 mpp_mem_pool_debug = 0;
typedef struct MppMemPoolNode_t {
void *check;
@@ -48,7 +50,7 @@ typedef struct MppMemPoolNode_t {
typedef struct MppMemPoolImpl_t {
void *check;
const char *caller;
const char *name;
size_t size;
pthread_mutex_t lock;
struct list_head service_link;
@@ -120,8 +122,8 @@ static void put_pool(MppMemPoolSrv *srv, MppMemPoolImpl *impl)
}
if (!list_empty(&impl->used)) {
mpp_err_f("pool %s found %d used buffer size %d\n",
impl->caller, impl->used_count, impl->size);
mpp_err_f("pool %-16s found %d used buffer size %4d\n",
impl->name, impl->used_count, impl->size);
list_for_each_entry_safe(node, m, &impl->used, MppMemPoolNode, list) {
MPP_FREE(node);
@@ -130,8 +132,8 @@ static void put_pool(MppMemPoolSrv *srv, MppMemPoolImpl *impl)
}
if (impl->used_count || impl->unused_count)
mpp_err_f("pool %s size %d found leaked buffer used:unused [%d:%d]\n",
impl->caller, impl->size, impl->used_count, impl->unused_count);
mpp_err_f("pool %-16s size %4d found leaked buffer used:unused [%d:%d]\n",
impl->name, impl->size, impl->used_count, impl->unused_count);
pthread_mutex_unlock(&impl->lock);
@@ -156,6 +158,7 @@ static void mem_pool_srv_deinit()
MppMemPoolImpl *pos, *n;
list_for_each_entry_safe(pos, n, &srv->list, MppMemPoolImpl, service_link) {
mem_pool_dbg_exit("pool %-16s size %4d leaked\n", pos->name, pos->size);
put_pool(srv, pos);
}
}
@@ -166,7 +169,7 @@ static void mem_pool_srv_deinit()
srv_mem_pool = NULL;
}
MppMemPool mpp_mem_pool_init_f(const char *caller, size_t size)
MppMemPool mpp_mem_pool_init(const char *name, size_t size, const char *caller)
{
MppMemPoolSrv *srv = get_srv_mem_pool(caller);
MppMemPoolImpl *pool;
@@ -188,7 +191,7 @@ MppMemPool mpp_mem_pool_init_f(const char *caller, size_t size)
}
pool->check = pool;
pool->caller = caller;
pool->name = name;
pool->size = size;
pool->used_count = 0;
pool->unused_count = 0;
@@ -202,22 +205,23 @@ MppMemPool mpp_mem_pool_init_f(const char *caller, size_t size)
list_add_tail(&pool->service_link, &srv->list);
pthread_mutex_unlock(&srv->lock);
mem_pool_dbg_flow("pool %d init from %s\n", size, caller);
mem_pool_dbg_flow("pool %-16s size %4d init at %s\n", pool->name, size, caller);
return pool;
}
void mpp_mem_pool_deinit_f(const char *caller, MppMemPool pool)
void mpp_mem_pool_deinit(MppMemPool pool, const char *caller)
{
MppMemPoolSrv *srv = get_srv_mem_pool(caller);
MppMemPoolImpl *impl = (MppMemPoolImpl *)pool;
mem_pool_dbg_flow("pool %d deinit from %s\n", impl->size, caller);
mem_pool_dbg_flow("pool %-16s size %4d deinit at %s\n",
impl->name, impl->size, caller);
put_pool(srv, impl);
}
void *mpp_mem_pool_get_f(const char *caller, MppMemPool pool)
void *mpp_mem_pool_get(MppMemPool pool, const char *caller)
{
MppMemPoolImpl *impl = (MppMemPoolImpl *)pool;
MppMemPoolNode *node = NULL;
@@ -225,8 +229,8 @@ void *mpp_mem_pool_get_f(const char *caller, MppMemPool pool)
pthread_mutex_lock(&impl->lock);
mem_pool_dbg_flow("pool %d get used:unused [%d:%d] from %s\n", impl->size,
impl->used_count, impl->unused_count, caller);
mem_pool_dbg_flow("pool %-16s size %4d get used:unused [%d:%d] at %s\n",
impl->name, impl->size, impl->used_count, impl->unused_count, caller);
if (!list_empty(&impl->unused)) {
node = list_first_entry(&impl->unused, MppMemPoolNode, list);
@@ -243,7 +247,7 @@ void *mpp_mem_pool_get_f(const char *caller, MppMemPool pool)
node = mpp_malloc_size(MppMemPoolNode, sizeof(MppMemPoolNode) + impl->size);
if (!node) {
mpp_err_f("failed to create node from size %d pool\n", impl->size);
mpp_err_f("failed to create node from size %4d pool\n", impl->size);
goto DONE;
}
@@ -262,7 +266,7 @@ DONE:
return ptr;
}
void mpp_mem_pool_put_f(const char *caller, MppMemPool pool, void *p)
void mpp_mem_pool_put(MppMemPool pool, void *p, const char *caller)
{
MppMemPoolImpl *impl = (MppMemPoolImpl *)pool;
MppMemPoolNode *node = (MppMemPoolNode *)((rk_u8 *)p - sizeof(MppMemPoolNode));
@@ -280,8 +284,8 @@ void mpp_mem_pool_put_f(const char *caller, MppMemPool pool, void *p)
pthread_mutex_lock(&impl->lock);
mem_pool_dbg_flow("pool %d put used:unused [%d:%d] from %s\n", impl->size,
impl->used_count, impl->unused_count, caller);
mem_pool_dbg_flow("pool %-16s size %4d put used:unused [%d:%d] at %s\n",
impl->name, impl->size, impl->used_count, impl->unused_count, caller);
list_del_init(&node->list);
list_add(&node->list, &impl->unused);

View File

@@ -22,38 +22,38 @@ int main()
mpp_log("mpp_mem_pool_test start\n");
pool = mpp_mem_pool_init(size);
pool = mpp_mem_pool_init_f(MODULE_TAG, size);
if (NULL == pool) {
mpp_err("mpp_mem_pool_test mpp_mem_pool_init failed\n");
goto mpp_mem_pool_test_failed;
}
for (i = 0; i < MPP_MEM_POOL_TEST_COUNT; i++) {
p[i] = mpp_mem_pool_get(pool);
p[i] = mpp_mem_pool_get_f(pool);
if (!p[i]) {
mpp_err("mpp_mem_pool_test mpp_mem_pool_get failed\n");
mpp_err("mpp_mem_pool_test mpp_mem_pool_get_f failed\n");
goto mpp_mem_pool_test_failed;
}
}
for (i = 0; i < MPP_MEM_POOL_TEST_COUNT / 2; i++) {
if (p[i]) {
mpp_mem_pool_put(pool, p[i]);
mpp_mem_pool_put_f(pool, p[i]);
p[i] = NULL;
}
}
for (i = 0; i < MPP_MEM_POOL_TEST_COUNT / 4; i++) {
p[i] = mpp_mem_pool_get(pool);
p[i] = mpp_mem_pool_get_f(pool);
if (!p[i]) {
mpp_err("mpp_mem_pool_test mpp_mem_pool_get failed\n");
mpp_err("mpp_mem_pool_test mpp_mem_pool_get_f failed\n");
goto mpp_mem_pool_test_failed;
}
}
for (i = 0; i < MPP_MEM_POOL_TEST_COUNT; i++) {
if (p[i]) {
mpp_mem_pool_put(pool, p[i]);
mpp_mem_pool_put_f(pool, p[i]);
p[i] = NULL;
}
}