Merge pull request #5317 from rokups/feature/coroutines

Coroutine improvements
This commit is contained in:
Andreas Rumpf 2017-02-26 23:24:29 +01:00 • committed by GitHub
commit 895e2aea15
28 changed files with 800 additions and 769 deletions

View file

@ -0,0 +1,23 @@
import coro
var
stackCheckValue = 1100220033
numbers = newSeqOfCap[int](10)
proc testExceptions(id: int, sleep: float) =
try:
numbers.add(id)
suspend(sleep)
numbers.add(id)
raise (ref ValueError)()
except:
numbers.add(id)
suspend(sleep)
numbers.add(id)
suspend(sleep)
numbers.add(id)
start(proc() = testExceptions(1, 0.01))
start(proc() = testExceptions(2, 0.011))
run()
doAssert(stackCheckValue == 1100220033, "Thread stack got corrupted")
doAssert(numbers == @[1, 2, 1, 2, 1, 2, 1, 2, 1, 2], "Coroutines executed in incorrect order")

View file

@ -0,0 +1 @@
-d:nimCoroutines

15
tests/coroutines/tgc.nim Normal file
View file

@ -0,0 +1,15 @@
import coro
var maxOccupiedMemory = 0
proc testGC() =
var numbers = newSeq[int](100)
maxOccupiedMemory = max(maxOccupiedMemory, getOccupiedMem())
suspend(0)
start(testGC)
start(testGC)
run()
GC_fullCollect()
doAssert(getOccupiedMem() < maxOccupiedMemory, "GC did not free any memory allocated in coroutines")

View file

@ -0,0 +1 @@
-d:nimCoroutines

View file

@ -0,0 +1,24 @@
import coro
include system/timers
var
stackCheckValue = 1100220033
numbers = newSeqOfCap[int](10)
iterator theIterator(id: int, sleep: float): int =
for i in 0..<5:
yield 10 * id + i
suspend(sleep)
proc theCoroutine(id: int, sleep: float32) =
for n in theIterator(id, sleep):
numbers.add(n)
var start = getTicks()
start(proc() = theCoroutine(1, 0.01))
start(proc() = theCoroutine(2, 0.011))
run()
var executionTime = getTicks() - start
doAssert(executionTime >= 55_000_000.Nanos and executionTime < 56_000_000.Nanos, "Coroutines executed too short")
doAssert(stackCheckValue == 1100220033, "Thread stack got corrupted")
doAssert(numbers == @[10, 20, 11, 21, 12, 22, 13, 23, 14, 24], "Coroutines executed in incorrect order")

View file

@ -0,0 +1 @@
-d:nimCoroutines