From 14ebe3e4cf12b3925b03e19691ec9f76a48c63b9 Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Tue, 19 Jun 2018 19:07:57 +0900 Subject: [PATCH] Cleaned up GC memory management a bit --- lib/system/osalloc.nim | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/system/osalloc.nim b/lib/system/osalloc.nim index 9b517cf49..048077b50 100644 --- a/lib/system/osalloc.nim +++ b/lib/system/osalloc.nim @@ -86,28 +86,36 @@ elif defined(nintendoswitch): var stack: pointer - proc osAllocPages(size: int): pointer {.inline.} = + proc alignSize(size: int): int = + (size + 0x00000FFF) and not 0x00000FFF + + proc freeMem(p: pointer, msize: int) = + let size = alignSize(msize) + discard svcUnmapMemory(p, stack, size.uint64) + virtmemFreeMap(p, size.csize) + free(stack) + + proc osAllocPages(msize: int): pointer {.inline.} = + let size = alignSize(msize) stack = memalign(0x1000, size) result = virtmemReserveMap(size.csize) let rc = svcMapMemory(result, stack, size.uint64) if rc.uint32 != 0: - #discard svcUnmapMemory(result, stack, size.csize) + freeMem(result, size) raiseOutOfMem() - proc osTryAllocPages(size: int): pointer {.inline.} = + proc osTryAllocPages(msize: int): pointer {.inline.} = + let size = alignSize(msize) stack = memalign(0x1000, size) result = virtmemReserveMap(size.csize) let rc = svcMapMemory(result, stack, size.uint64) if rc.uint32 != 0: - #discard svcUnmapMemory(result, stack, size.csize) + freeMem(result, size) result = nil proc osDeallocPages(p: pointer, size: int) {.inline.} = when reallyOsDealloc: - discard svcUnmapMemory(p, stack, size.uint64) - virtmemFreeMap(p, size.csize) - free(stack) - + freeMem(p, size) elif defined(posix): const