[mpp_buffer]: Add caller to MppBuffer functions

Add caller parameter to all mpp_buffer functions.

Change-Id: Ibebd2a31b302988fe1ed480de575189ce57e41a5
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2016-12-15 16:56:39 +08:00
parent 447bb9e951
commit 249f83f35b
6 changed files with 94 additions and 24 deletions

View File

@@ -213,13 +213,13 @@ typedef struct MppBufferInfo_t {
* imported buffer is leak or not and trace its usage inside mpp process. So we attach this kind * imported buffer is leak or not and trace its usage inside mpp process. So we attach this kind
* of buffer to default misc buffer group for management. * of buffer to default misc buffer group for management.
*/ */
#define mpp_buffer_commit(group, info, ...) \ #define mpp_buffer_commit(group, info) \
mpp_buffer_import_with_tag(group, info, NULL, MODULE_TAG, __FUNCTION__) mpp_buffer_import_with_tag(group, info, NULL, MODULE_TAG, __FUNCTION__)
#define mpp_buffer_import(buffer, info, ...) \ #define mpp_buffer_import(buffer, info) \
mpp_buffer_import_with_tag(NULL, info, buffer, MODULE_TAG, __FUNCTION__) mpp_buffer_import_with_tag(NULL, info, buffer, MODULE_TAG, __FUNCTION__)
#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) \ #define mpp_buffer_put(buffer) \
@@ -228,6 +228,24 @@ typedef struct MppBufferInfo_t {
#define mpp_buffer_inc_ref(buffer) \ #define mpp_buffer_inc_ref(buffer) \
mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__) mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__)
#define mpp_buffer_info_get(buffer, info) \
mpp_buffer_info_get_with_caller(buffer, info, __FUNCTION__)
#define mpp_buffer_read(buffer, offset, data, size) \
mpp_buffer_read_with_caller(buffer, offset, data, size, __FUNCTION__)
#define mpp_buffer_write(buffer, offset, data, size) \
mpp_buffer_write_with_caller(buffer, offset, data, size, __FUNCTION__)
#define mpp_buffer_get_ptr(buffer) \
mpp_buffer_get_ptr_with_caller(buffer, __FUNCTION__)
#define mpp_buffer_get_fd(buffer) \
mpp_buffer_get_fd_with_caller(buffer, __FUNCTION__)
#define mpp_buffer_get_size(buffer) \
mpp_buffer_get_size_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__)
@@ -254,12 +272,12 @@ MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t
MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller); MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller);
MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller); 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_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller);
MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size); MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller);
MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t size); MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller);
void *mpp_buffer_get_ptr(MppBuffer buffer); void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller);
int mpp_buffer_get_fd(MppBuffer buffer); int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller);
size_t mpp_buffer_get_size(MppBuffer buffer); size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller);
MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode, MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode,
const char *tag, const char *caller); const char *tag, const char *caller);

View File

@@ -114,7 +114,9 @@ extern RK_U32 mpp_buffer_debug;
* if input buffer is NULL then buffer will be register to unused list * if input buffer is NULL then buffer will be register to unused list
* otherwise the buffer will be register to used list and set to paramter buffer * otherwise the buffer will be register to used list and set to paramter buffer
* *
* mpp_buffer_destroy : destroy a buffer, it must be on unused status * mpp_buffer_mmap : The created mpp_buffer can not be accessed directly.
* It required map to access. This is an optimization
* for reducing virtual memory usage.
* *
* mpp_buffer_get_unused : get unused buffer with size. it will first search * mpp_buffer_get_unused : get unused buffer with size. it will first search
* the unused list. if failed it will create on from * the unused list. if failed it will create on from
@@ -134,6 +136,7 @@ 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_mmap(MppBufferImpl *buffer, const char* caller);
MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller);
MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller); MPP_RET mpp_buffer_ref_dec(MppBufferImpl *buffer, const char* caller);
MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size); MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size);

View File

@@ -114,7 +114,7 @@ MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller)
return mpp_buffer_ref_inc((MppBufferImpl*)buffer, caller); 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_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller)
{ {
if (NULL == buffer || NULL == data) { if (NULL == buffer || NULL == data) {
mpp_err_f("invalid input: buffer %p data %p\n", buffer, data); mpp_err_f("invalid input: buffer %p data %p\n", buffer, data);
@@ -125,13 +125,18 @@ MPP_RET mpp_buffer_read(MppBuffer buffer, size_t offset, void *data, size_t size
return MPP_OK; return MPP_OK;
MppBufferImpl *p = (MppBufferImpl*)buffer; MppBufferImpl *p = (MppBufferImpl*)buffer;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
void *src = p->info.ptr; void *src = p->info.ptr;
mpp_assert(src != NULL); mpp_assert(src != NULL);
memcpy(data, (char*)src + offset, size); if (src)
memcpy(data, (char*)src + offset, size);
return MPP_OK; return MPP_OK;
} }
MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t size) MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller)
{ {
if (NULL == buffer || NULL == data) { if (NULL == buffer || NULL == data) {
mpp_err_f("invalid input: buffer %p data %p\n", buffer, data); mpp_err_f("invalid input: buffer %p data %p\n", buffer, data);
@@ -142,13 +147,18 @@ MPP_RET mpp_buffer_write(MppBuffer buffer, size_t offset, void *data, size_t siz
return MPP_OK; return MPP_OK;
MppBufferImpl *p = (MppBufferImpl*)buffer; MppBufferImpl *p = (MppBufferImpl*)buffer;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
void *dst = p->info.ptr; void *dst = p->info.ptr;
mpp_assert(dst != NULL); mpp_assert(dst != NULL);
memcpy((char*)dst + offset, data, size); if (dst)
memcpy((char*)dst + offset, data, size);
return MPP_OK; return MPP_OK;
} }
void *mpp_buffer_get_ptr(MppBuffer buffer) void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller)
{ {
if (NULL == buffer) { if (NULL == buffer) {
mpp_err_f("invalid NULL input\n"); mpp_err_f("invalid NULL input\n");
@@ -156,12 +166,17 @@ void *mpp_buffer_get_ptr(MppBuffer buffer)
} }
MppBufferImpl *p = (MppBufferImpl*)buffer; MppBufferImpl *p = (MppBufferImpl*)buffer;
void *ptr = p->info.ptr; if (NULL == p->info.ptr)
mpp_assert(ptr != NULL); mpp_buffer_mmap(p, caller);
return ptr;
mpp_assert(p->info.ptr != NULL);
if (NULL == p->info.ptr)
mpp_err("mpp_buffer_get_ptr buffer %p ret NULL caller\n", buffer, caller);
return p->info.ptr;
} }
int mpp_buffer_get_fd(MppBuffer buffer) int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller)
{ {
if (NULL == buffer) { if (NULL == buffer) {
mpp_err_f("invalid NULL input\n"); mpp_err_f("invalid NULL input\n");
@@ -173,12 +188,14 @@ int mpp_buffer_get_fd(MppBuffer buffer)
#ifdef RKPLATFORM #ifdef RKPLATFORM
mpp_assert(fd >= 0); mpp_assert(fd >= 0);
if (fd < 0)
mpp_err("mpp_buffer_get_fd buffer %p fd %d caller %s\n", buffer, fd, caller);
#endif #endif
return fd; return fd;
} }
size_t mpp_buffer_get_size(MppBuffer buffer) size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller)
{ {
if (NULL == buffer) { if (NULL == buffer) {
mpp_err_f("invalid NULL input\n"); mpp_err_f("invalid NULL input\n");
@@ -186,17 +203,25 @@ size_t mpp_buffer_get_size(MppBuffer buffer)
} }
MppBufferImpl *p = (MppBufferImpl*)buffer; MppBufferImpl *p = (MppBufferImpl*)buffer;
if (p->info.size == 0)
mpp_err("mpp_buffer_get_size buffer %p ret zero size caller %s\n", buffer, caller);
return p->info.size; return p->info.size;
} }
MPP_RET mpp_buffer_info_get(MppBuffer buffer, MppBufferInfo *info) MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller)
{ {
if (NULL == buffer || NULL == info) { if (NULL == buffer || NULL == info) {
mpp_err_f("invalid input: buffer %p info %p\n", buffer, info); mpp_err_f("invalid input: buffer %p info %p\n", buffer, info);
return MPP_ERR_UNKNOW; return MPP_ERR_UNKNOW;
} }
*info = ((MppBufferImpl*)buffer)->info; MppBufferImpl *p = (MppBufferImpl*)buffer;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
*info = p->info;
(void)caller;
return MPP_OK; return MPP_OK;
} }

View File

@@ -38,6 +38,7 @@ typedef enum MppBufOps_e {
GRP_OPS_BUTT = GRP_DESTROY, GRP_OPS_BUTT = GRP_DESTROY,
BUF_COMMIT, BUF_COMMIT,
BUF_CREATE, BUF_CREATE,
BUF_MMAP,
BUF_REF_INC, BUF_REF_INC,
BUF_REF_DEC, BUF_REF_DEC,
BUF_DESTROY, BUF_DESTROY,
@@ -113,6 +114,7 @@ static const char *ops2str[BUF_OPS_BUTT] = {
"grp destroy", "grp destroy",
"buf commit ", "buf commit ",
"buf create ", "buf create ",
"buf mmap ",
"buf ref inc", "buf ref inc",
"buf ref dec", "buf ref dec",
"buf destroy", "buf destroy",
@@ -306,6 +308,28 @@ RET:
return ret; return ret;
} }
MPP_RET mpp_buffer_mmap(MppBufferImpl *buffer, const char* caller)
{
AutoMutex auto_lock(MppBufferService::get_lock());
MPP_BUF_FUNCTION_ENTER();
MPP_RET ret = MPP_NOK;
MppBufferGroupImpl *group = SEARCH_GROUP_BY_ID(buffer->group_id);
if (group && group->alloc_api && group->alloc_api->mmap) {
ret = group->alloc_api->mmap(group->allocator, &buffer->info);
buffer_group_add_log(group, buffer, BUF_MMAP, caller);
}
if (ret)
mpp_err_f("buffer %p group %p fd %d map failed caller %s\n",
buffer, group, buffer->info.fd, caller);
MPP_BUF_FUNCTION_LEAVE();
return ret;
}
MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller) MPP_RET mpp_buffer_ref_inc(MppBufferImpl *buffer, const char* caller)
{ {
AutoMutex auto_lock(MppBufferService::get_lock()); AutoMutex auto_lock(MppBufferService::get_lock());
@@ -718,8 +742,6 @@ MppBufferGroupImpl *MppBufferService::get_group_by_id(RK_U32 id)
} }
} }
mpp_err_f("can not find group with id %d\n", id);
return NULL; return NULL;
} }

View File

@@ -30,6 +30,7 @@ typedef struct MppAllocatorApi_t {
MPP_RET (*free)(MppAllocator allocator, MppBufferInfo *data); MPP_RET (*free)(MppAllocator allocator, MppBufferInfo *data);
MPP_RET (*import)(MppAllocator allocator, MppBufferInfo *data); MPP_RET (*import)(MppAllocator allocator, MppBufferInfo *data);
MPP_RET (*release)(MppAllocator allocator, MppBufferInfo *data); MPP_RET (*release)(MppAllocator allocator, MppBufferInfo *data);
MPP_RET (*mmap)(MppAllocator allocator, MppBufferInfo *data);
} MppAllocatorApi; } MppAllocatorApi;
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -107,6 +107,7 @@ static MppAllocatorApi mpp_allocator_api = {
mpp_allocator_free, mpp_allocator_free,
mpp_allocator_import, mpp_allocator_import,
mpp_allocator_release, mpp_allocator_release,
NULL,
}; };
MPP_RET mpp_allocator_get(MppAllocator *allocator, MppAllocatorApi **api, MppBufferType type) MPP_RET mpp_allocator_get(MppAllocator *allocator, MppAllocatorApi **api, MppBufferType type)