diff --git a/mpp/base/inc/mpp_buffer_impl.h b/mpp/base/inc/mpp_buffer_impl.h index 76b6fb41..36918040 100644 --- a/mpp/base/inc/mpp_buffer_impl.h +++ b/mpp/base/inc/mpp_buffer_impl.h @@ -90,8 +90,10 @@ struct MppBufferGroupImpl_t { // buffer force clear mode flag RK_U32 clear_on_exit; + RK_U32 dump_on_exit; // is_orphan: 0 - normal group 1 - orphan group RK_U32 is_orphan; + RK_U32 is_finalizing; // buffer log function RK_U32 log_runtime_en; diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index 9c1ea695..9665e756 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -213,7 +213,7 @@ static MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer, const char *caller) buffer_group_add_log(group, buffer, BUF_DESTROY, caller); - if (group->is_orphan && !group->usage) { + if (group->is_orphan && !group->usage && !group->is_finalizing) { MppBufferService::get_instance()->put_group(group); } } else { @@ -648,13 +648,16 @@ MppBufferService::~MppBufferService() } } - // remove all orphan buffer + // remove all orphan buffer group if (!list_empty(&mListOrphan)) { - MppBufferImpl *pos, *n; + MppBufferGroupImpl *pos, *n; mpp_log_f("cleaning leaked buffer\n"); - list_for_each_entry_safe(pos, n, &mListOrphan, MppBufferImpl, list_status) { - deinit_buffer_no_lock(pos, __FUNCTION__); + + list_for_each_entry_safe(pos, n, &mListOrphan, MppBufferGroupImpl, list_group) { + pos->clear_on_exit = 1; + pos->is_finalizing = 1; + put_group(pos); } } finished = 1; @@ -706,6 +709,7 @@ MppBufferGroupImpl *MppBufferService::get_group(const char *tag, const char *cal p->limit = BUFFER_GROUP_SIZE_DEFAULT; p->group_id = id; p->clear_on_exit = (mpp_buffer_debug & MPP_BUF_DBG_CLR_ON_EXIT) ? (1) : (0); + p->dump_on_exit = (mpp_buffer_debug & MPP_BUF_DBG_DUMP_ON_EXIT) ? (1) : (0); mpp_allocator_get(&p->allocator, &p->alloc_api, type); @@ -765,8 +769,7 @@ void MppBufferService::put_group(MppBufferGroupImpl *p) if (list_empty(&p->list_used)) { destroy_group(p); } else { - if (!finalizing || - (finalizing && (mpp_buffer_debug & MPP_BUF_DBG_DUMP_ON_EXIT))) { + if (!finalizing || (finalizing && p->dump_on_exit)) { mpp_err("mpp_group %p tag %s caller %s mode %s type %s deinit with %d bytes not released\n", p, p->tag, p->caller, mode2str[p->mode], type2str[p->type], p->usage); @@ -777,10 +780,12 @@ void MppBufferService::put_group(MppBufferGroupImpl *p) if (p->clear_on_exit) { MppBufferImpl *pos, *n; - mpp_err("force release all remaining buffer\n"); + if (p->dump_on_exit) + mpp_err("force release all remaining buffer\n"); list_for_each_entry_safe(pos, n, &p->list_used, MppBufferImpl, list_status) { - mpp_err("clearing buffer %p\n", pos); + if (p->dump_on_exit) + mpp_err("clearing buffer %p\n", pos); pos->ref_count = 0; pos->used = 0; pos->discard = 0;