mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-31 10:22:15 +00:00
Merge pull request #4213 from oderwat/nimphpext-stack-gc
Made nimphpext work with gc:stack.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user