diff --git a/osal/android/os_mem.c b/osal/android/os_mem.c index 19f648f6..bd747acd 100644 --- a/osal/android/os_mem.c +++ b/osal/android/os_mem.c @@ -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); diff --git a/osal/inc/mpp_mem.h b/osal/inc/mpp_mem.h index 5bca3f66..a3fd815e 100644 --- a/osal/inc/mpp_mem.h +++ b/osal/inc/mpp_mem.h @@ -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 diff --git a/osal/mpp_log.cpp b/osal/mpp_log.cpp index d549064d..05bc7177 100644 --- a/osal/mpp_log.cpp +++ b/osal/mpp_log.cpp @@ -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'; diff --git a/osal/mpp_mem.cpp b/osal/mpp_mem.cpp index dbbec435..366955b5 100644 --- a/osal/mpp_mem.cpp +++ b/osal/mpp_mem.cpp @@ -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) diff --git a/osal/os_malloc.h b/osal/os_malloc.h index 813a85e0..8c0ef8a6 100644 --- a/osal/os_malloc.h +++ b/osal/os_malloc.h @@ -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 diff --git a/osal/test/mpp_mem_test.c b/osal/test/mpp_mem_test.c index ed46256f..27fc2c33 100644 --- a/osal/test/mpp_mem_test.c +++ b/osal/test/mpp_mem_test.c @@ -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"); + 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; } diff --git a/osal/window/os_mem.c b/osal/window/os_mem.c index d47076f5..6301f13f 100644 --- a/osal/window/os_mem.c +++ b/osal/window/os_mem.c @@ -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);