From 62ffe1517c1eaad25a1e7baa32b9b61465cff120 Mon Sep 17 00:00:00 2001 From: Judah Caruso Date: Mon, 4 Dec 2023 09:02:21 -0700 Subject: [PATCH] fix broken mremap alternative on darwin; re-add mremap for linux --- interpreter/src/vm/vm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/interpreter/src/vm/vm.c b/interpreter/src/vm/vm.c index 79a5c058..2de011a5 100644 --- a/interpreter/src/vm/vm.c +++ b/interpreter/src/vm/vm.c @@ -219,8 +219,17 @@ bool ovm_engine_memory_ensure_capacity(ovm_engine_t *engine, i64 minimum_size) { if (engine->memory == NULL) { new_addr = mmap(NULL, minimum_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); } else { - munmap(engine->memory, engine->memory_size); - new_addr = mmap(NULL, minimum_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + #ifdef _BH_DARWIN // Darwin doesn't support mremap so we need to map and copy it manually + new_addr = mmap(engine->memory, minimum_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (new_addr == MAP_FAILED) return false; + + memcpy(new_addr, engine->memory, engine->memory_size); + munmap(engine->memory, engine->memory_size); + #elif defined(_BH_LINUX) + new_addr = mremap(engine->memory, engine->memory_size, minimum_size, MREMAP_MAYMOVE); + #else + #error "Unhandled platform." + #endif } if (new_addr == MAP_FAILED) { -- 2.25.1