[mpp_buffer]: force release buffer on memory leak and add abort to dump leak statue

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@725 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2016-05-11 12:01:56 +00:00
parent 6653f8164f
commit 0f8d4ba6db

View File

@@ -127,6 +127,7 @@ MPP_RET deinit_group_no_lock(MppBufferGroupImpl *group)
if (legacy->count) { if (legacy->count) {
mpp_log("found legacy group has buffer remain, start dumping\n"); mpp_log("found legacy group has buffer remain, start dumping\n");
mpp_buffer_group_dump(legacy); mpp_buffer_group_dump(legacy);
abort();
} }
} }
return MPP_OK; return MPP_OK;
@@ -146,8 +147,6 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer)
func(group->allocator, &buffer->info); func(group->allocator, &buffer->info);
group->usage -= buffer->info.size; group->usage -= buffer->info.size;
group->count--; group->count--;
if (!buffer->discard)
group->count_unused--;
} else { } else {
group = SEARCH_GROUP_ORPHAN(buffer->group_id); group = SEARCH_GROUP_ORPHAN(buffer->group_id);
mpp_assert(group); mpp_assert(group);
@@ -188,8 +187,9 @@ static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer)
static void dump_buffer_info(MppBufferImpl *buffer) static void dump_buffer_info(MppBufferImpl *buffer)
{ {
mpp_log("buffer %p fd %4d size %10d ref_count %3d caller %s\n", mpp_log("buffer %p fd %4d size %10d ref_count %3d discard %d caller %s\n",
buffer, buffer->info.fd, buffer->info.size, buffer->ref_count, buffer->caller); buffer, buffer->info.fd, buffer->info.size,
buffer->ref_count, buffer->discard, buffer->caller);
} }
MPP_RET mpp_buffer_create(const char *tag, const char *caller, RK_U32 group_id, MppBufferInfo *info) MPP_RET mpp_buffer_create(const char *tag, const char *caller, RK_U32 group_id, MppBufferInfo *info)
@@ -354,6 +354,7 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const
p->group_id = service.group_id; p->group_id = service.group_id;
mpp_env_get_u32("mpp_buffer_debug", &mpp_buffer_debug, 0); mpp_env_get_u32("mpp_buffer_debug", &mpp_buffer_debug, 0);
p->debug_leak = (mpp_buffer_debug | MPP_BUF_DBG_MEM_LEAK ) ? (1) : (0);
p->log_runtime_en = (mpp_buffer_debug | MPP_BUF_DBG_OPS_RUNTIME) ? (1) : (0); p->log_runtime_en = (mpp_buffer_debug | MPP_BUF_DBG_OPS_RUNTIME) ? (1) : (0);
p->log_history_en = (mpp_buffer_debug | MPP_BUF_DBG_OPS_HISTORY) ? (1) : (0); p->log_history_en = (mpp_buffer_debug | MPP_BUF_DBG_OPS_HISTORY) ? (1) : (0);
@@ -373,6 +374,23 @@ MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const
return MPP_OK; return MPP_OK;
} }
static MPP_RET force_clear_mpp_buffer_group(MppBufferGroupImpl *p)
{
MppBufferImpl *pos, *n;
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 pos\n");
pos->ref_count = 0;
pos->used = 0;
pos->discard = 0;
deinit_buffer_no_lock(pos);
}
return MPP_OK;
}
MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p) MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p)
{ {
if (NULL == p) { if (NULL == p) {
@@ -393,14 +411,20 @@ MPP_RET mpp_buffer_group_deinit(MppBufferGroupImpl *p)
if (list_empty(&p->list_used)) { if (list_empty(&p->list_used)) {
deinit_group_no_lock(p); deinit_group_no_lock(p);
} else { } else {
// otherwise move the group to list_orphan and wait for buffer release
list_del_init(&p->list_group);
list_add_tail(&p->list_group, &service.mListOrphan);
mpp_err("mpp_group %p tag %s caller %s mode %s type %s deinit with %d bytes not released\n", 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); p, p->tag, p->caller, mode2str[p->mode], type2str[p->type], p->usage);
mpp_buffer_group_dump(p); mpp_buffer_group_dump(p);
/* force to release leaked buffer */
if (!p->debug_leak) {
force_clear_mpp_buffer_group(p);
} else {
abort();
// otherwise move the group to list_orphan and wait for buffer release
list_del_init(&p->list_group);
list_add_tail(&p->list_group, &service.mListOrphan);
}
} }
return MPP_OK; return MPP_OK;