summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/coro.nim92
-rw-r--r--lib/system.nim3
-rw-r--r--tests/coroutines/texceptions.nim24
-rw-r--r--tests/coroutines/texceptions.nim.cfg1
-rw-r--r--tests/coroutines/tgc.nim15
-rw-r--r--tests/coroutines/tgc.nim.cfg1
-rw-r--r--tests/coroutines/titerators.nim26
-rw-r--r--tests/coroutines/titerators.nim.cfg1
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