mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-06 17:46:50 +08:00
[mpp_mem]: add mpp_realloc function
git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@98 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
@@ -22,6 +22,13 @@ int os_malloc(void **memptr, size_t alignment, size_t size)
|
||||
return posix_memalign(memptr, alignment, size);
|
||||
}
|
||||
|
||||
int os_realloc(void *src, void **dst, size_t alignment, size_t size)
|
||||
{
|
||||
(void)alignment;
|
||||
*dst = realloc(src, size);
|
||||
return (*dst) ? (0) : (-1);
|
||||
}
|
||||
|
||||
void os_free(void *ptr)
|
||||
{
|
||||
free(ptr);
|
||||
|
@@ -27,6 +27,9 @@
|
||||
#define mpp_malloc(type, count) \
|
||||
(type*)mpp_osal_malloc(MODULE_TAG, sizeof(type) * (count))
|
||||
|
||||
#define mpp_realloc(ptr, type, count) \
|
||||
(type*)mpp_osal_realloc(MODULE_TAG, ptr, sizeof(type) * (count))
|
||||
|
||||
#define mpp_free(ptr) mpp_osal_free(ptr)
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -35,6 +38,7 @@ extern "C" {
|
||||
|
||||
void mpp_show_mem_status();
|
||||
void *mpp_osal_malloc(char *tag, size_t size);
|
||||
void *mpp_osal_realloc(char *tag, void *ptr, size_t size);
|
||||
void mpp_osal_free(void *ptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@@ -53,7 +53,7 @@ void _mpp_log(const char *tag, const char *fmt, ...)
|
||||
} else if (len == MPP_LOG_MAX_LEN) {
|
||||
buf = msg_log_warning;
|
||||
} else if (fmt[len - 1] != '\n') {
|
||||
char msg[MPP_LOG_MAX_LEN];
|
||||
char msg[MPP_LOG_MAX_LEN+1];
|
||||
snprintf(msg, sizeof(msg), "%s", fmt);
|
||||
msg[len] = '\n';
|
||||
msg[len + 1] = '\0';
|
||||
@@ -79,7 +79,7 @@ void _mpp_err(const char *tag, const char *fmt, ...)
|
||||
} else if (len == MPP_LOG_MAX_LEN) {
|
||||
buf = msg_log_warning;
|
||||
} else if (fmt[len - 1] != '\n') {
|
||||
char msg[MPP_LOG_MAX_LEN];
|
||||
char msg[MPP_LOG_MAX_LEN+1];
|
||||
snprintf(msg, sizeof(msg), "%s", fmt);
|
||||
msg[len] = '\n';
|
||||
msg[len + 1] = '\0';
|
||||
|
@@ -89,6 +89,44 @@ void *mpp_osal_malloc(char *tag, size_t size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *mpp_osal_realloc(char *tag, void *ptr, size_t size)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
if (NULL == ptr)
|
||||
return mpp_osal_malloc(tag, size);
|
||||
|
||||
if (0 == size)
|
||||
return NULL;
|
||||
|
||||
get_osal_mem_flag();
|
||||
|
||||
if (osal_mem_flag & OSAL_MEM_LIST_EN) {
|
||||
struct mem_node *pos, *n;
|
||||
ret = NULL;
|
||||
list_for_each_entry_safe(pos, n, &mem_list, struct mem_node, list) {
|
||||
if (ptr == pos->ptr) {
|
||||
if (MPP_OK == os_realloc(ptr, &pos->ptr, RK_OSAL_MEM_ALIGN, size)) {
|
||||
pos->size = size;
|
||||
strncpy(pos->tag, tag, sizeof(pos->tag));
|
||||
ret = pos->ptr;
|
||||
} else {
|
||||
list_del_init(&pos->list);
|
||||
free(pos);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret = realloc(ptr, size);
|
||||
}
|
||||
|
||||
if (NULL == ret)
|
||||
mpp_err("mpp_realloc ptr 0x%p to size %d failed\n", ptr, size);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void mpp_osal_free(void *ptr)
|
||||
{
|
||||
if (NULL == ptr)
|
||||
|
@@ -22,6 +22,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
int os_malloc(void **memptr, size_t alignment, size_t size);
|
||||
int os_realloc(void *src, void **dst, size_t alignment, size_t size);
|
||||
void os_free(void *ptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define MODULE_TAG "mpp_malloc_test"
|
||||
#define MODULE_TAG "mpp_mem_test"
|
||||
|
||||
#include "mpp_log.h"
|
||||
#include "mpp_env.h"
|
||||
@@ -29,11 +29,20 @@ int main()
|
||||
mpp_set_env_u32("osal_mem_list", 1);
|
||||
tmp = mpp_malloc(int, 100);
|
||||
if (tmp) {
|
||||
mpp_log("malloc success\n");
|
||||
mpp_free(tmp);
|
||||
mpp_log("malloc success ptr 0x%p\n", tmp);
|
||||
} else {
|
||||
mpp_log("malloc failed\n");
|
||||
}
|
||||
if (tmp) {
|
||||
tmp = mpp_realloc(tmp, int, 200);
|
||||
if (tmp) {
|
||||
mpp_log("realloc success ptr 0x%p\n", tmp);
|
||||
} else {
|
||||
mpp_log("realloc failed\n");
|
||||
}
|
||||
}
|
||||
mpp_free(tmp);
|
||||
mpp_log("mpp_mem_test done\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -23,6 +23,12 @@ int os_malloc(void **memptr, size_t alignment, size_t size)
|
||||
return (*memptr) ? (0) : (-1);
|
||||
}
|
||||
|
||||
int os_realloc(void *src, void **dst, size_t alignment, size_t size)
|
||||
{
|
||||
*dst = _aligned_realloc(src, size, alignment);
|
||||
return (*dst) ? (0) : (-1);
|
||||
}
|
||||
|
||||
void os_free(void *ptr)
|
||||
{
|
||||
_aligned_free(ptr);
|
||||
|
Reference in New Issue
Block a user