[mpp_buffer]: add more mpp_buffer log information

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@1043 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2016-07-19 09:38:21 +00:00
parent 58cf49779a
commit ee095068bc
4 changed files with 58 additions and 50 deletions

View File

@@ -221,6 +221,12 @@ typedef struct MppBufferInfo_t {
#define mpp_buffer_get(group, buffer, size, ...) \ #define mpp_buffer_get(group, buffer, size, ...) \
mpp_buffer_get_with_tag(group, buffer, size, MODULE_TAG, __FUNCTION__) mpp_buffer_get_with_tag(group, buffer, size, MODULE_TAG, __FUNCTION__)
#define mpp_buffer_put(buffer) \
mpp_buffer_put_with_caller(buffer, __FUNCTION__)
#define mpp_buffer_inc_ref(buffer) \
mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__);
#define mpp_buffer_group_get_internal(group, type, ...) \ #define mpp_buffer_group_get_internal(group, type, ...) \
mpp_buffer_group_get(group, type, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) mpp_buffer_group_get(group, type, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__)
@@ -244,8 +250,8 @@ MPP_RET mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, Mp
const char *tag, const char *caller); const char *tag, const char *caller);
MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t size, MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t size,
const char *tag, const char *caller); const char *tag, const char *caller);
MPP_RET mpp_buffer_put(MppBuffer buffer); MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller);
MPP_RET mpp_buffer_inc_ref(MppBuffer buffer); MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller);
MPP_RET mpp_buffer_info_get(MppBuffer buffer, MppBufferInfo *info); MPP_RET mpp_buffer_info_get(MppBuffer buffer, MppBufferInfo *info);
MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size); MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size);

View File

@@ -134,9 +134,8 @@ extern RK_U32 mpp_buffer_debug;
* mpp_buffer_destory - destroy the buffer * mpp_buffer_destory - destroy the buffer
*/ */
MPP_RET mpp_buffer_create(const char *tag, const char *caller, MppBufferGroupImpl *group, MppBufferInfo *info, MppBufferImpl **buffer); MPP_RET mpp_buffer_create(const char *tag, const char *caller, MppBufferGroupImpl *group, MppBufferInfo *info, MppBufferImpl **buffer);
MPP_RET mpp_buffer_destroy(MppBufferImpl *buffer); MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller);
MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer); MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller);
MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer);
MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size); MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size);
MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const char *caller, MppBufferMode mode, MppBufferType type); MPP_RET mpp_buffer_group_init(MppBufferGroupImpl **group, const char *tag, const char *caller, MppBufferMode mode, MppBufferType type);

View File

@@ -92,24 +92,25 @@ MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t
return (buf) ? (MPP_OK) : (MPP_NOK); return (buf) ? (MPP_OK) : (MPP_NOK);
} }
MPP_RET mpp_buffer_put(MppBuffer buffer)
MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller)
{ {
if (NULL == buffer) { if (NULL == buffer) {
mpp_err("mpp_buffer_put invalid input: buffer %p\n", buffer); mpp_err("mpp_buffer_put invalid input: buffer %p\n", buffer);
return MPP_ERR_UNKNOW; return MPP_ERR_UNKNOW;
} }
return mpp_buffer_ref_dec((MppBufferImpl*)buffer); return mpp_buffer_ref_dec((MppBufferImpl*)buffer, caller);
} }
MPP_RET mpp_buffer_inc_ref(MppBuffer buffer) MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller)
{ {
if (NULL == buffer) { if (NULL == buffer) {
mpp_err("mpp_buffer_inc_ref invalid input: buffer %p\n", buffer); mpp_err("mpp_buffer_inc_ref invalid input: buffer %p\n", buffer);
return MPP_ERR_UNKNOW; return MPP_ERR_UNKNOW;
} }
return mpp_buffer_ref_inc((MppBufferImpl*)buffer); return mpp_buffer_ref_inc((MppBufferImpl*)buffer, caller);
} }
MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size) MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size)

View File

@@ -50,6 +50,7 @@ typedef struct MppBufLog_t {
RK_S32 buffer_id; RK_S32 buffer_id;
MppBufOps ops; MppBufOps ops;
RK_S32 ref_count; RK_S32 ref_count;
const char *caller;
} MppBufLog; } MppBufLog;
// use this class only need it to init legacy group before main // use this class only need it to init legacy group before main
@@ -118,14 +119,14 @@ static const char *ops2str[BUF_OPS_BUTT] = {
RK_U32 mpp_buffer_debug = 0; RK_U32 mpp_buffer_debug = 0;
void buffer_group_add_log(MppBufferGroupImpl *group, MppBufferImpl *buffer, MppBufOps ops) void buffer_group_add_log(MppBufferGroupImpl *group, MppBufferImpl *buffer, MppBufOps ops, const char* caller)
{ {
if (group->log_runtime_en) { if (group->log_runtime_en) {
if (buffer) { if (buffer) {
mpp_log("group %3d buffer %4d ops %s ref_count %d\n", group->group_id, mpp_log("group %2d buffer %2d ops %s ref_count %d caller %s\n", group->group_id,
buffer->buffer_id, ops2str[ops], buffer->ref_count); buffer->buffer_id, ops2str[ops], buffer->ref_count, caller);
} else { } else {
mpp_log("group %3d ops %s\n", group->group_id, ops2str[ops]); mpp_log("group %2d ops %s\n", group->group_id, ops2str[ops]);
} }
} }
if (group->log_history_en) { if (group->log_history_en) {
@@ -137,6 +138,7 @@ void buffer_group_add_log(MppBufferGroupImpl *group, MppBufferImpl *buffer, MppB
log->buffer_id = (buffer) ? (buffer->buffer_id) : (-1); log->buffer_id = (buffer) ? (buffer->buffer_id) : (-1);
log->ops = ops; log->ops = ops;
log->ref_count = (buffer) ? (buffer->ref_count) : (0); log->ref_count = (buffer) ? (buffer->ref_count) : (0);
log->caller = caller;
} }
if (group->log_count >= BUFFER_OPS_MAX_COUNT) { if (group->log_count >= BUFFER_OPS_MAX_COUNT) {
struct list_head *tmp = logs->next; struct list_head *tmp = logs->next;
@@ -157,8 +159,8 @@ void buffer_group_dump_log(MppBufferGroupImpl *group)
MppBufLog *log = list_entry(tmp, MppBufLog, list); MppBufLog *log = list_entry(tmp, MppBufLog, list);
list_del_init(tmp); list_del_init(tmp);
if (log->buffer_id >= 0) { if (log->buffer_id >= 0) {
mpp_log("group %3d buffer %4d ops %s ref_count %d\n", group->group_id, mpp_log("group %2d buffer %2d ops %s ref_count %d caller %s\n", group->group_id,
log->buffer_id, ops2str[log->ops], log->ref_count); log->buffer_id, ops2str[log->ops], log->ref_count, log->caller);
} else { } else {
mpp_log("group %3d ops %s\n", group->group_id, ops2str[log->ops]); mpp_log("group %3d ops %s\n", group->group_id, ops2str[log->ops]);
} }
@@ -167,7 +169,7 @@ void buffer_group_dump_log(MppBufferGroupImpl *group)
} }
} }
MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer) MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer, const char *caller)
{ {
mpp_assert(buffer->ref_count == 0); mpp_assert(buffer->ref_count == 0);
mpp_assert(buffer->used == 0); mpp_assert(buffer->used == 0);
@@ -181,7 +183,7 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer)
group->usage -= buffer->info.size; group->usage -= buffer->info.size;
group->buffer_count--; group->buffer_count--;
buffer_group_add_log(group, buffer, BUF_DESTROY); buffer_group_add_log(group, buffer, BUF_DESTROY, caller);
if (group->is_orphan && !group->usage) { if (group->is_orphan && !group->usage) {
MppBufferService::get_instance()->put_group(group); MppBufferService::get_instance()->put_group(group);
@@ -192,7 +194,7 @@ MPP_RET deinit_buffer_no_lock(MppBufferImpl *buffer)
return MPP_OK; return MPP_OK;
} }
static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer) static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer, const char *caller)
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id); MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id);
@@ -210,7 +212,7 @@ static MPP_RET inc_buffer_ref_no_lock(MppBufferImpl *buffer)
ret = MPP_NOK; ret = MPP_NOK;
} }
} }
buffer_group_add_log(group, buffer, BUF_REF_INC); buffer_group_add_log(group, buffer, BUF_REF_INC, caller);
buffer->ref_count++; buffer->ref_count++;
return ret; return ret;
} }
@@ -240,7 +242,7 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller,
} }
if (group->limit_count && group->buffer_count >= group->limit_count) { if (group->limit_count && group->buffer_count >= group->limit_count) {
mpp_err_f("reach group count limit %d\n", group->limit_count); mpp_err_f("group %d reach count limit %d\n", group->group_id, group->limit_count);
ret = MPP_NOK; ret = MPP_NOK;
goto RET; goto RET;
} }
@@ -286,52 +288,44 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller,
group->buffer_count++; group->buffer_count++;
group->count_unused++; group->count_unused++;
buffer_group_add_log(group, p,
(group->mode == MPP_BUFFER_INTERNAL) ? (BUF_CREATE) : (BUF_COMMIT),
caller);
if (buffer) { if (buffer) {
inc_buffer_ref_no_lock(p); inc_buffer_ref_no_lock(p, caller);
*buffer = p; *buffer = p;
} }
buffer_group_add_log(group, p, (group->mode == MPP_BUFFER_INTERNAL) ? (BUF_CREATE) : (BUF_COMMIT));
RET: RET:
MPP_BUF_FUNCTION_LEAVE(); MPP_BUF_FUNCTION_LEAVE();
return ret; return ret;
} }
MPP_RET mpp_buffer_destroy(MppBufferImpl *buffer) MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller)
{ {
AutoMutex auto_lock(MppBufferService::get_lock()); AutoMutex auto_lock(MppBufferService::get_lock());
MPP_BUF_FUNCTION_ENTER(); MPP_BUF_FUNCTION_ENTER();
MPP_RET ret = deinit_buffer_no_lock(buffer); MPP_RET ret = inc_buffer_ref_no_lock(buffer, caller);
MPP_BUF_FUNCTION_LEAVE();
return ret;
}
MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer)
{
AutoMutex auto_lock(MppBufferService::get_lock());
MPP_BUF_FUNCTION_ENTER();
MPP_RET ret = inc_buffer_ref_no_lock(buffer);
MPP_BUF_FUNCTION_LEAVE(); MPP_BUF_FUNCTION_LEAVE();
return ret; return ret;
} }
MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer) MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller)
{ {
AutoMutex auto_lock(MppBufferService::get_lock()); AutoMutex auto_lock(MppBufferService::get_lock());
MPP_BUF_FUNCTION_ENTER(); MPP_BUF_FUNCTION_ENTER();
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id); MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id);
buffer_group_add_log(group, buffer, BUF_REF_DEC); buffer_group_add_log(group, buffer, BUF_REF_DEC, caller);
if (buffer->ref_count <= 0) { if (buffer->ref_count <= 0) {
mpp_err_f("found non-positive ref_count %d caller %s\n", mpp_err_f("found non-positive ref_count %d caller %s\n",
buffer->ref_count, buffer->caller); buffer->ref_count, buffer->caller);
mpp_abort();
ret = MPP_NOK; ret = MPP_NOK;
} else { } else {
buffer->ref_count--; buffer->ref_count--;
@@ -339,10 +333,10 @@ MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer)
buffer->used = 0; buffer->used = 0;
list_del_init(&buffer->list_status); list_del_init(&buffer->list_status);
if (group == MppBufferService::get_instance()->get_misc_group(group->mode, group->type)) { if (group == MppBufferService::get_instance()->get_misc_group(group->mode, group->type)) {
deinit_buffer_no_lock(buffer); deinit_buffer_no_lock(buffer, caller);
} else { } else {
if (buffer->discard) { if (buffer->discard) {
deinit_buffer_no_lock(buffer); deinit_buffer_no_lock(buffer, caller);
} else { } else {
list_add_tail(&buffer->list_status, &group->list_unused); list_add_tail(&buffer->list_status, &group->list_unused);
group->count_unused++; group->count_unused++;
@@ -369,20 +363,28 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size)
if (!list_empty(&p->list_unused)) { if (!list_empty(&p->list_unused)) {
MppBufferImpl *pos, *n; MppBufferImpl *pos, *n;
RK_S32 found = 0;
RK_S32 search_count = 0;
list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) { list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) {
mpp_buf_dbg(MPP_BUF_DBG_CHECK_SIZE, "request size %d on buf idx %d size %d\n", mpp_buf_dbg(MPP_BUF_DBG_CHECK_SIZE, "request size %d on buf idx %d size %d\n",
size, pos->buffer_id, pos->info.size); size, pos->buffer_id, pos->info.size);
if (pos->info.size >= size) { if (pos->info.size >= size) {
buffer = pos; buffer = pos;
inc_buffer_ref_no_lock(buffer); inc_buffer_ref_no_lock(buffer, __FUNCTION__);
found = 1;
break; break;
} else { } else {
if (MPP_BUFFER_INTERNAL == p->mode) { if (MPP_BUFFER_INTERNAL == p->mode) {
deinit_buffer_no_lock(pos); deinit_buffer_no_lock(pos, __FUNCTION__);
p->count_unused--; p->count_unused--;
} else
search_count++;
} }
} }
}
if (!found && search_count)
mpp_err_f("can not found match buffer with size larger than %d\n", size);
} }
MPP_BUF_FUNCTION_LEAVE(); MPP_BUF_FUNCTION_LEAVE();
@@ -441,7 +443,7 @@ MPP_RET mpp_buffer_group_reset(MppBufferGroupImpl *p)
if (!list_empty(&p->list_unused)) { if (!list_empty(&p->list_unused)) {
MppBufferImpl *pos, *n; MppBufferImpl *pos, *n;
list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) { list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) {
deinit_buffer_no_lock(pos); deinit_buffer_no_lock(pos, __FUNCTION__);
p->count_unused--; p->count_unused--;
} }
} }
@@ -534,7 +536,7 @@ MppBufferService::~MppBufferService()
if (!list_empty(&mListOrphan)) { if (!list_empty(&mListOrphan)) {
MppBufferImpl *pos, *n; MppBufferImpl *pos, *n;
list_for_each_entry_safe(pos, n, &mListOrphan, MppBufferImpl, list_status) { list_for_each_entry_safe(pos, n, &mListOrphan, MppBufferImpl, list_status) {
deinit_buffer_no_lock(pos); deinit_buffer_no_lock(pos, __FUNCTION__);
} }
} }
} }
@@ -586,7 +588,7 @@ MppBufferGroupImpl *MppBufferService::get_group(const char *tag, const char *cal
mpp_allocator_get(&p->allocator, &p->alloc_api, type); mpp_allocator_get(&p->allocator, &p->alloc_api, type);
buffer_group_add_log(p, NULL, GRP_CREATE); buffer_group_add_log(p, NULL, GRP_CREATE, __FUNCTION__);
return p; return p;
} }
@@ -603,13 +605,13 @@ MppBufferGroupImpl *MppBufferService::get_misc_group(MppBufferMode mode, MppBuff
void MppBufferService::put_group(MppBufferGroupImpl *p) void MppBufferService::put_group(MppBufferGroupImpl *p)
{ {
buffer_group_add_log(p, NULL, GRP_RELEASE); buffer_group_add_log(p, NULL, GRP_RELEASE, __FUNCTION__);
// remove unused list // remove unused list
if (!list_empty(&p->list_unused)) { if (!list_empty(&p->list_unused)) {
MppBufferImpl *pos, *n; MppBufferImpl *pos, *n;
list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) { list_for_each_entry_safe(pos, n, &p->list_unused, MppBufferImpl, list_status) {
deinit_buffer_no_lock(pos); deinit_buffer_no_lock(pos, __FUNCTION__);
p->count_unused--; p->count_unused--;
} }
} }
@@ -633,7 +635,7 @@ void MppBufferService::put_group(MppBufferGroupImpl *p)
pos->ref_count = 0; pos->ref_count = 0;
pos->used = 0; pos->used = 0;
pos->discard = 0; pos->discard = 0;
deinit_buffer_no_lock(pos); deinit_buffer_no_lock(pos, __FUNCTION__);
p->count_used--; p->count_used--;
} }
@@ -658,7 +660,7 @@ void MppBufferService::destroy_group(MppBufferGroupImpl *group)
group->count_used = 0; group->count_used = 0;
} }
buffer_group_add_log(group, NULL, GRP_DESTROY); buffer_group_add_log(group, NULL, GRP_DESTROY, __FUNCTION__);
if (group->log_history_en) { if (group->log_history_en) {
struct list_head *logs = &group->list_logs; struct list_head *logs = &group->list_logs;