diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2021-01-21 10:31:47 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-21 17:31:47 +0100 |
commit | dfe67970235d2c270a4fe91a7ba4451102d8eaac (patch) | |
tree | fe6b9e640884a43fb2d80eae675538d7b3ce0d0a /lib | |
parent | 57d5c1465a576e2d8bfc6496946aa24183c4456d (diff) | |
download | Nim-dfe67970235d2c270a4fe91a7ba4451102d8eaac.tar.gz |
fix #15628 (#16387)
* done * Apply suggestions from code review * fixup Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/coro.nim | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/pure/coro.nim b/lib/pure/coro.nim index 2a702b65b..2e997d73f 100644 --- a/lib/pure/coro.nim +++ b/lib/pure/coro.nim @@ -32,6 +32,10 @@ import lists include system/timers const defaultStackSize = 512 * 1024 +const useOrcArc = defined(gcArc) or defined(gcOrc) + +when useOrcArc: + proc nimGC_setStackBottom*(theStackBottom: pointer) = discard proc GC_addStack(bottom: pointer) {.cdecl, importc.} proc GC_removeStack(bottom: pointer) {.cdecl, importc.} @@ -59,7 +63,7 @@ else: const coroBackend = CORO_BACKEND_UCONTEXT when coroBackend == CORO_BACKEND_FIBERS: - import windows.winlean + import windows/winlean type Context = pointer @@ -185,7 +189,8 @@ proc initialize() = ctx.coroutines = initDoublyLinkedList[CoroutinePtr]() ctx.loop = Coroutine() ctx.loop.state = CORO_EXECUTING - ctx.ncbottom = GC_getActiveStack() + when not useOrcArc: + ctx.ncbottom = GC_getActiveStack() when coroBackend == CORO_BACKEND_FIBERS: ctx.loop.execContext = ConvertThreadToFiberEx(nil, FIBER_FLAG_FLOAT_SWITCH) @@ -195,7 +200,8 @@ proc switchTo(current, to: CoroutinePtr) = ## Switches execution from `current` into `to` context. to.lastRun = getTicks() # Update position of current stack so gc invoked from another stack knows how much to scan. - GC_setActiveStack(current.stack.bottom) + when not useOrcArc: + GC_setActiveStack(current.stack.bottom) nimGC_setStackBottom(current.stack.bottom) var frame = getFrameState() block: @@ -218,7 +224,8 @@ proc switchTo(current, to: CoroutinePtr) = {.error: "Invalid coroutine backend set.".} # Execution was just resumed. Restore frame information and set active stack. setFrameState(frame) - GC_setActiveStack(current.stack.bottom) + when not useOrcArc: + GC_setActiveStack(current.stack.bottom) nimGC_setStackBottom(ctx.ncbottom) proc suspend*(sleepTime: float = 0) = @@ -241,9 +248,10 @@ proc runCurrentTask() = # have to set active stack here as well. GC_removeStack() has to be called in main loop # because we still need stack available in final suspend(0) call from which we will not # return. - GC_addStack(sp) - # Activate current stack because we are executing in a new coroutine. - GC_setActiveStack(sp) + when not useOrcArc: + GC_addStack(sp) + # Activate current stack because we are executing in a new coroutine. + GC_setActiveStack(sp) current.state = CORO_EXECUTING try: current.fn() # Start coroutine execution @@ -312,7 +320,8 @@ proc run*() = next = ctx.current.next current.reference.coro = nil ctx.coroutines.remove(ctx.current) - GC_removeStack(current.stack.bottom) + when not useOrcArc: + GC_removeStack(current.stack.bottom) when coroBackend == CORO_BACKEND_FIBERS: DeleteFiber(current.execContext) else: |