mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-29 03:37:55 +00:00
* done * Apply suggestions from code review * fixup Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user