diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-05-25 02:55:24 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-05-25 02:55:24 +0200 |
commit | ad70fb4ffeb91f1cb847705f41ffaf3c2aefb67c (patch) | |
tree | dc2a92683e8d0c798aeddf333eb7671be20d9fea /lib | |
parent | 58ac5b80650f7315669da595f84afbf670479fc6 (diff) | |
parent | 5385798838983ece7510f5c8ad9993cee3a0386c (diff) | |
download | Nim-ad70fb4ffeb91f1cb847705f41ffaf3c2aefb67c.tar.gz |
Merge pull request #4213 from oderwat/nimphpext-stack-gc
Made nimphpext work with gc:stack.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/gc_stack.nim | 20 | ||||
-rw-r--r-- | lib/system/threads.nim | 4 |
2 files changed, 21 insertions, 3 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. diff --git a/lib/system/threads.nim b/lib/system/threads.nim index bdb737e35..99927fbac 100644 --- a/lib/system/threads.nim +++ b/lib/system/threads.nim @@ -301,7 +301,7 @@ type ## a pointer as a thread ID. {.deprecated: [TThread: Thread, TThreadId: ThreadId].} -when not defined(boehmgc) and not hasSharedHeap and not defined(gogc): +when not defined(boehmgc) and not hasSharedHeap and not defined(gogc) and not defined(gcstack): proc deallocOsPages() when defined(boehmgc): @@ -331,7 +331,7 @@ else: proc threadProcWrapStackFrame[TArg](thrd: ptr Thread[TArg]) = when defined(boehmgc): boehmGC_call_with_stack_base(threadProcWrapDispatch[TArg], thrd) - elif not defined(nogc) and not defined(gogc): + elif not defined(nogc) and not defined(gogc) and not defined(gcstack): var p {.volatile.}: proc(a: ptr Thread[TArg]) {.nimcall.} = threadProcWrapDispatch[TArg] when not hasSharedHeap: |