diff options
-rw-r--r-- | lib/pure/coro.nim | 92 | ||||
-rw-r--r-- | lib/system.nim | 3 | ||||
-rw-r--r-- | tests/coroutines/texceptions.nim | 24 | ||||
-rw-r--r-- | tests/coroutines/texceptions.nim.cfg | 1 | ||||
-rw-r--r-- | tests/coroutines/tgc.nim | 15 | ||||
-rw-r--r-- | tests/coroutines/tgc.nim.cfg | 1 | ||||
-rw-r--r-- | tests/coroutines/titerators.nim | 26 | ||||
-rw-r--r-- | tests/coroutines/titerators.nim.cfg | 1 |
8 files changed, 71 insertions, 92 deletions
diff --git a/lib/pure/coro.nim b/lib/pure/coro.nim index 1eb5cacad..e053f4427 100644 --- a/lib/pure/coro.nim +++ b/lib/pure/coro.nim @@ -294,95 +294,3 @@ proc wait*(c: proc(), interval=0.01) = ## Returns only after coroutine ``c`` has returned. ``interval`` is time in seconds how often. while alive(c): suspend(interval) - -when isMainModule: - var - stackCheckValue = 1100220033 - first: float64 = 0 - second: float64 = 1 - steps = 10 - i: int - order = newSeq[int](10) - - proc testFibonacci(id: int, sleep: float32) = - var sleepTime: float - while steps > 0: - echo id, " executing, slept for ", sleepTime - order[i] = id - i += 1 - steps -= 1 - swap first, second - second += first - var sleepStart = getTicks() - suspend(sleep) - sleepTime = float(getTicks() - sleepStart) / 1_000_000_000 - - start(proc() = testFibonacci(1, 0.01)) - start(proc() = testFibonacci(2, 0.021)) - run() - doAssert stackCheckValue == 1100220033 - doAssert first == 55.0 - doAssert order == @[1, 2, 1, 1, 2, 1, 1, 2, 1, 1] - - order = newSeq[int](10) - i = 0 - - proc testExceptions(id: int, sleep: float) = - try: - order[i] = id; i += 1 - suspend(sleep) - order[i] = id; i += 1 - raise (ref ValueError)() - except: - order[i] = id; i += 1 - suspend(sleep) - order[i] = id; i += 1 - suspend(sleep) - order[i] = id; i += 1 - - start(proc() = testExceptions(1, 0.01)) - start(proc() = testExceptions(2, 0.021)) - run() - doAssert order == @[1, 2, 1, 1, 1, 2, 2, 1, 2, 2] - doAssert stackCheckValue == 1100220033 - - order = newSeq[int](10) - i = 0 - - iterator suspendingIterator(sleep: float): int = - for i in 0..4: - yield i - suspend(sleep) - - proc terstIterators(id: int, sleep: float) = - for n in suspendingIterator(sleep): - order[i] = n - i += 1 - - start(proc() = terstIterators(1, 0.01)) - start(proc() = terstIterators(2, 0.021)) - run() - doAssert order == @[0, 0, 1, 2, 1, 3, 4, 2, 3, 4] - doAssert stackCheckValue == 1100220033 - - type Foo = ref object - number: int - - GC_fullCollect() - var occupiedMemory = getOccupiedMem() - - i = 0 - var objects = newSeq[Foo](100) - proc terstGc(id: int, sleep: float) = - for n in 0..<50: - objects[i] = Foo(number: n) - i += 1 - - start(proc() = terstIterators(1, 0.01)) - start(proc() = terstIterators(2, 0.021)) - run() - - doAssert occupiedMemory < getOccupiedMem() - objects = nil - GC_fullCollect() - doAssert occupiedMemory >= getOccupiedMem() diff --git a/lib/system.nim b/lib/system.nim index bd1d029fc..b37d74357 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2471,12 +2471,15 @@ template coroutinesSupportedPlatform(): bool = true when defined(nimCoroutines): + # Explicit opt-in. when not coroutinesSupportedPlatform(): {.error: "Coroutines are not supported on this architecture and/or garbage collector.".} const nimCoroutines* = true elif defined(noNimCoroutines): + # Explicit opt-out. const nimCoroutines* = false else: + # Autodetect coroutine support. const nimCoroutines* = false {.push checks: off.} diff --git a/tests/coroutines/texceptions.nim b/tests/coroutines/texceptions.nim new file mode 100644 index 000000000..7ad4964a0 --- /dev/null +++ b/tests/coroutines/texceptions.nim @@ -0,0 +1,24 @@ +import coro +var + stackCheckValue = 1100220033 + numbers = newSeq[int](10) + i = 0 + +proc testExceptions(id: int, sleep: float) = + try: + numbers[i] = id; inc(i) + suspend(sleep) + numbers[i] = id; inc(i) + raise (ref ValueError)() + except: + numbers[i] = id; inc(i) + suspend(sleep) + numbers[i] = id; inc(i) + suspend(sleep) + numbers[i] = id; inc(i) + +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") diff --git a/tests/coroutines/texceptions.nim.cfg b/tests/coroutines/texceptions.nim.cfg new file mode 100644 index 000000000..b011bc585 --- /dev/null +++ b/tests/coroutines/texceptions.nim.cfg @@ -0,0 +1 @@ +-d:nimCoroutines diff --git a/tests/coroutines/tgc.nim b/tests/coroutines/tgc.nim new file mode 100644 index 000000000..66a12ab9d --- /dev/null +++ b/tests/coroutines/tgc.nim @@ -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") diff --git a/tests/coroutines/tgc.nim.cfg b/tests/coroutines/tgc.nim.cfg new file mode 100644 index 000000000..b011bc585 --- /dev/null +++ b/tests/coroutines/tgc.nim.cfg @@ -0,0 +1 @@ +-d:nimCoroutines diff --git a/tests/coroutines/titerators.nim b/tests/coroutines/titerators.nim new file mode 100644 index 000000000..c263b49db --- /dev/null +++ b/tests/coroutines/titerators.nim @@ -0,0 +1,26 @@ +import coro +include system/timers + +var + stackCheckValue = 1100220033 + numbers = newSeq[int](10) + i = 0 + +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[i] = n + inc(i) + +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") diff --git a/tests/coroutines/titerators.nim.cfg b/tests/coroutines/titerators.nim.cfg new file mode 100644 index 000000000..b011bc585 --- /dev/null +++ b/tests/coroutines/titerators.nim.cfg @@ -0,0 +1 @@ +-d:nimCoroutines |