diff options
Diffstat (limited to 'lib/system/gc_stack.nim')
-rw-r--r-- | lib/system/gc_stack.nim | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/system/gc_stack.nim b/lib/system/gc_stack.nim index c251a4d0b..37d19db89 100644 --- a/lib/system/gc_stack.nim +++ b/lib/system/gc_stack.nim @@ -8,7 +8,23 @@ # "Stack GC" for embedded devices or ultra performance requirements. -include osalloc +when defined(nimphpext): + proc roundup(x, v: int): int {.inline.} = + result = (x + (v-1)) and not (v-1) + proc emalloc(size: int): pointer {.importc:"_emalloc".} + proc efree(mem: pointer) {.importc:"_efree".} + + proc osAllocPages(size: int): pointer {.inline.} = + emalloc(size) + + proc osTryAllocPages(size: int): pointer {.inline.} = + emalloc(size) + + proc osDeallocPages(p: pointer, size: int) {.inline.} = + efree(p) + +else: + include osalloc # We manage memory as a thread local stack. Since the allocation pointer # is detached from the control flow pointer, this model is vastly more @@ -100,6 +116,7 @@ proc allocSlowPath(r: var MemRegion; size: int) = fresh.size = s fresh.head = nil fresh.tail = nil + fresh.next = nil inc r.totalSize, s let old = r.tail if old == nil: @@ -168,6 +185,7 @@ proc setObstackPtr*(r: var MemRegion; sp: StackPtr) = proc obstackPtr*(): StackPtr = tlRegion.obstackPtr() proc setObstackPtr*(sp: StackPtr) = tlRegion.setObstackPtr(sp) +proc deallocAll*() = tlRegion.deallocAll() proc joinRegion*(dest: var MemRegion; src: MemRegion) = # merging is not hard. |