From d0f73b1c6a80e262f956e5ff0717a71a42381277 Mon Sep 17 00:00:00 2001 From: rcaridade145 Date: Sun, 11 Jan 2026 14:00:55 +0000 Subject: [PATCH] Refactor AllocateMemory and FreeMemory functions --- src/util/MemMapper/MemMapperUnix.cpp | 76 +++++++++++++++++++--------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/src/util/MemMapper/MemMapperUnix.cpp b/src/util/MemMapper/MemMapperUnix.cpp index 8e800e53..5d14216d 100644 --- a/src/util/MemMapper/MemMapperUnix.cpp +++ b/src/util/MemMapper/MemMapperUnix.cpp @@ -40,31 +40,57 @@ namespace MemMapper munmap(baseAddr, size); } - void* AllocateMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags, bool fromReservation) - { - void* r; - if(fromReservation) - { - uint64 page_size = sysconf(_SC_PAGESIZE); - void* page = baseAddr; - if ( (uint64) baseAddr % page_size != 0 ) - page = (void*) ((uint64)baseAddr & ~(page_size - 1)); - if( mprotect(page, size, GetProt(permissionFlags)) == 0 ) - r = baseAddr; - else - r = nullptr; - } - else - r = mmap(baseAddr, size, GetProt(permissionFlags), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - return r; - } + void* AllocateMemory(void* baseAddr, size_t size, + PAGE_PERMISSION permissionFlags, + bool fromReservation) +{ + size_t pageSize = sPageSize; + + uintptr_t addr = reinterpret_cast(baseAddr); + uintptr_t pageStart = addr & ~(pageSize - 1); + + size_t offset = addr - pageStart; + size_t totalSize = offset + size; + totalSize = (totalSize + pageSize - 1) & ~(pageSize - 1); + + if (fromReservation) + { + if (mprotect(reinterpret_cast(pageStart), + totalSize, + GetProt(permissionFlags)) != 0) + return nullptr; + + return baseAddr; + } + + return mmap(baseAddr, + size, + GetProt(permissionFlags), + MAP_PRIVATE | MAP_ANONYMOUS, + -1, + 0); +} + + +void FreeMemory(void* baseAddr, size_t size, bool fromReservation) +{ + if (!fromReservation) + { + munmap(baseAddr, size); + return; + } + + uintptr_t addr = reinterpret_cast(baseAddr); + uintptr_t pageStart = addr & ~(sPageSize - 1); + + size_t offset = addr - pageStart; + size_t totalSize = offset + size; + totalSize = (totalSize + sPageSize - 1) & ~(sPageSize - 1); + + mprotect(reinterpret_cast(pageStart), + totalSize, + PROT_NONE); +} - void FreeMemory(void* baseAddr, size_t size, bool fromReservation) - { - if (fromReservation) - mprotect(baseAddr, size, PROT_NONE); - else - munmap(baseAddr, size); - } };