Module coro

Nim coroutines implementation supports several context switching methods: ucontext: available on unix and alike (default) setjmp: available on unix and alike (x86/64 only) Fibers: available and required on windows.

-d:nimCoroutines Required to build this module.
-d:nimCoroutinesUcontext Use ucontext backend.
-d:nimCoroutinesSetjmp Use setjmp backend.
-d:nimCoroutinesSetjmpBundled Use bundled setjmp implementation.


os, lists, winlean


CoroutineRef = ref object
  coro: CoroutinePtr
CoroutineRef holds a pointer to actual coroutine object. Public API always returns CoroutineRef instead of CoroutinePtr in order to allow holding a reference to coroutine object while it can be safely deallocated by coroutine scheduler loop. In this case Coroutine.reference.coro is set to nil. Public API checks for for it being nil and gracefully fails if it is nil.


proc suspend(sleepTime: float = 0) {...}{.raises: [], tags: [].}
Stops coroutine execution and resumes no sooner than after sleeptime seconds. Until then other coroutines are executed.
proc start(c: proc (); stacksize: int = defaultStackSize): CoroutineRef {...}{.discardable,
    raises: [Exception], tags: [RootEffect].}
Schedule coroutine for execution. It does not run immediately.
proc run() {...}{.raises: [Exception], tags: [TimeEffect].}
Starts main coroutine scheduler loop which exits when all coroutines exit. Calling this proc starts execution of first coroutine.
proc alive(c: CoroutineRef): bool {...}{.raises: [], tags: [].}
Returns true if coroutine has not returned, false otherwise.
proc wait(c: CoroutineRef; interval = 0.01) {...}{.raises: [], tags: [].}
Returns only after coroutine c has returned. interval is time in seconds how often.

© 2006–2018 Andreas Rumpf
Licensed under the MIT License.