diff --git a/core/config.h b/core/config.h index 6b4392b7..a00d241c 100644 --- a/core/config.h +++ b/core/config.h @@ -272,6 +272,26 @@ #define BH_ENABLE_GC_VERIFY 0 #endif +/* Enable global heap pool if heap verification is enabled */ +#if BH_ENABLE_GC_VERIFY != 0 +#define WASM_ENABLE_GLOBAL_HEAP_POOL 1 +#endif + +/* Global heap pool */ +#ifndef WASM_ENABLE_GLOBAL_HEAP_POOL +#define WASM_ENABLE_GLOBAL_HEAP_POOL 0 +#endif + +/* Global heap pool size in bytes */ +#ifndef WASM_GLOBAL_HEAP_SIZE +#if WASM_ENABLE_SPEC_TEST != 0 +/* Spec test requires more heap pool size */ +#define WASM_GLOBAL_HEAP_SIZE (300 * 1024 * 1024) +#else +#define WASM_GLOBAL_HEAP_SIZE (10 * 1024 * 1024) +#endif +#endif + /* Max app number of all modules */ #define MAX_APP_INSTALLATIONS 3 diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index fac6f4af..49a9b086 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -75,8 +75,17 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, void wasm_runtime_memory_destroy() { - if (memory_mode == MEMORY_MODE_POOL) - mem_allocator_destroy(pool_allocator); + if (memory_mode == MEMORY_MODE_POOL) { +#if BH_ENABLE_GC_VERIFY == 0 + (void)mem_allocator_destroy(pool_allocator); +#else + int ret = mem_allocator_destroy(pool_allocator); + if (ret != 0) { + /* Memory leak detected */ + exit(-1); + } +#endif + } memory_mode = MEMORY_MODE_UNKNOWN; } diff --git a/core/shared/mem-alloc/ems/ems_kfc.c b/core/shared/mem-alloc/ems/ems_kfc.c index d2a1eb70..cb405fd1 100644 --- a/core/shared/mem-alloc/ems/ems_kfc.c +++ b/core/shared/mem-alloc/ems/ems_kfc.c @@ -125,23 +125,24 @@ int gc_destroy_with_pool(gc_handle_t handle) { gc_heap_t *heap = (gc_heap_t *)handle; + int ret = GC_SUCCESS; + #if BH_ENABLE_GC_VERIFY != 0 hmu_t *cur = (hmu_t *)heap->base_addr; hmu_t *end = (hmu_t *)((char *)heap->base_addr + heap->current_size); + if (!heap->is_heap_corrupted && (hmu_t *)((char *)cur + hmu_get_size(cur)) != end) { os_printf("Memory leak detected:\n"); gci_dump(heap); -#if WASM_ENABLE_SPEC_TEST != 0 - while (1) { - } -#endif + ret = GC_ERROR; } #endif + os_mutex_destroy(&heap->lock); memset(heap->base_addr, 0, heap->current_size); memset(heap, 0, sizeof(gc_heap_t)); - return GC_SUCCESS; + return ret; } uint32 diff --git a/core/shared/mem-alloc/mem_alloc.c b/core/shared/mem-alloc/mem_alloc.c index 3a3748c4..f952c185 100644 --- a/core/shared/mem-alloc/mem_alloc.c +++ b/core/shared/mem-alloc/mem_alloc.c @@ -25,10 +25,10 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf, pool_buf, pool_buf_size); } -void +int mem_allocator_destroy(mem_allocator_t allocator) { - gc_destroy_with_pool((gc_handle_t)allocator); + return gc_destroy_with_pool((gc_handle_t)allocator); } uint32 diff --git a/core/shared/mem-alloc/mem_alloc.cmake b/core/shared/mem-alloc/mem_alloc.cmake index be57f379..c0b4157f 100644 --- a/core/shared/mem-alloc/mem_alloc.cmake +++ b/core/shared/mem-alloc/mem_alloc.cmake @@ -6,6 +6,10 @@ set (MEM_ALLOC_DIR ${CMAKE_CURRENT_LIST_DIR}) include_directories(${MEM_ALLOC_DIR}) +if (WAMR_BUILD_GC_VERIFY EQUAL 1) + add_definitions (-DBH_ENABLE_GC_VERIFY=1) +endif () + file (GLOB_RECURSE source_all ${MEM_ALLOC_DIR}/ems/*.c ${MEM_ALLOC_DIR}/tlsf/*.c diff --git a/core/shared/mem-alloc/mem_alloc.h b/core/shared/mem-alloc/mem_alloc.h index 224eb736..1f35b279 100644 --- a/core/shared/mem-alloc/mem_alloc.h +++ b/core/shared/mem-alloc/mem_alloc.h @@ -23,7 +23,7 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf, void *pool_buf, uint32_t pool_buf_size); -void +int mem_allocator_destroy(mem_allocator_t allocator); uint32 diff --git a/product-mini/platforms/nuttx/wamr.mk b/product-mini/platforms/nuttx/wamr.mk index d694cbdc..36953a67 100644 --- a/product-mini/platforms/nuttx/wamr.mk +++ b/product-mini/platforms/nuttx/wamr.mk @@ -261,7 +261,7 @@ endif ifeq ($(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL),y) CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=1 -CFLAGS += -DWASM_GLOBAL_HEAP_SIZE=$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) +CFLAGS += -DWASM_GLOBAL_HEAP_SIZE="$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) * 1024" else CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0 endif diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 94432953..2b306417 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -285,11 +285,7 @@ moudle_destroyer(uint8 *buffer, uint32 size) #endif /* WASM_ENABLE_MULTI_MODULE */ #if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 -#ifdef __NuttX__ -static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE * BH_KB] = { 0 }; -#else -static char global_heap_buf[10 * 1024 * 1024] = { 0 }; -#endif +static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 }; #endif int