mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-10 19:40:03 +08:00
[mpp_buffer]: Fix error on release orphan group
Change-Id: Ib915000941a2380c908b6c6f934b4b8bb8680fa9 Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Signed-off-by: Fu Yuhao <fuyuhao@sunniwell.net>
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user