[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
* 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__)
#define mpp_buffer_import(buffer, info, ...) \
#define mpp_buffer_import(buffer, info) \
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__)
#define mpp_buffer_put(buffer) \
@@ -228,6 +228,24 @@ typedef struct MppBufferInfo_t {
#define mpp_buffer_inc_ref(buffer) \
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, ...) \
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_inc_ref_with_caller(MppBuffer buffer, const char *caller);
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_write(MppBuffer buffer, size_t offset, void *data, size_t size);
void *mpp_buffer_get_ptr(MppBuffer buffer);
int mpp_buffer_get_fd(MppBuffer buffer);
size_t mpp_buffer_get_size(MppBuffer buffer);
MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller);
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_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller);
void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller);
int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller);
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,
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
* 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
* 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_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_dec(MppBufferImpl *buffer, const char* caller);
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);
}
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) {
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;
MppBufferImpl *p = (MppBufferImpl*)buffer;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
void *src = p->info.ptr;
mpp_assert(src != NULL);
if (src)
memcpy(data, (char*)src + offset, size);
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) {
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;
MppBufferImpl *p = (MppBufferImpl*)buffer;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
void *dst = p->info.ptr;
mpp_assert(dst != NULL);
if (dst)
memcpy((char*)dst + offset, data, size);
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) {
mpp_err_f("invalid NULL input\n");
@@ -156,12 +166,17 @@ void *mpp_buffer_get_ptr(MppBuffer buffer)
}
MppBufferImpl *p = (MppBufferImpl*)buffer;
void *ptr = p->info.ptr;
mpp_assert(ptr != NULL);
return ptr;
if (NULL == p->info.ptr)
mpp_buffer_mmap(p, caller);
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) {
mpp_err_f("invalid NULL input\n");
@@ -173,12 +188,14 @@ int mpp_buffer_get_fd(MppBuffer buffer)
#ifdef RKPLATFORM
mpp_assert(fd >= 0);
if (fd < 0)
mpp_err("mpp_buffer_get_fd buffer %p fd %d caller %s\n", buffer, fd, caller);
#endif
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) {
mpp_err_f("invalid NULL input\n");
@@ -186,17 +203,25 @@ size_t mpp_buffer_get_size(MppBuffer 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;
}
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) {
mpp_err_f("invalid input: buffer %p info %p\n", buffer, info);
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;
}

View File

@@ -38,6 +38,7 @@ typedef enum MppBufOps_e {
GRP_OPS_BUTT = GRP_DESTROY,
BUF_COMMIT,
BUF_CREATE,
BUF_MMAP,
BUF_REF_INC,
BUF_REF_DEC,
BUF_DESTROY,
@@ -113,6 +114,7 @@ static const char *ops2str[BUF_OPS_BUTT] = {
"grp destroy",
"buf commit ",
"buf create ",
"buf mmap ",
"buf ref inc",
"buf ref dec",
"buf destroy",
@@ -306,6 +308,28 @@ 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)
{
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;
}

View File

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

View File

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