summary refs log tree commit diff stats
path: root/lib/pure/asyncfutures.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-07-09 20:15:40 +0200
committerAraq <rumpf_a@web.de>2019-07-09 20:15:57 +0200
commit55e8aefbea2c6a152af903e60832a026b8bbf091 (patch)
tree1cbc7bdc1907edd7dac64c51643db5d26fd05973 /lib/pure/asyncfutures.nim
parent73c570d1d99651b4f79a0bc5f7e10027e5b7208a (diff)
downloadNim-55e8aefbea2c6a152af903e60832a026b8bbf091.tar.gz
newruntime: async progress
Diffstat (limited to 'lib/pure/asyncfutures.nim')
-rw-r--r--lib/pure/asyncfutures.nim32
1 files changed, 24 insertions, 8 deletions
diff --git a/lib/pure/asyncfutures.nim b/lib/pure/asyncfutures.nim
index 4a80056e2..1243a17f2 100644
--- a/lib/pure/asyncfutures.nim
+++ b/lib/pure/asyncfutures.nim
@@ -144,16 +144,32 @@ proc checkFinished[T](future: Future[T]) =
       raise err
 
 proc call(callbacks: var CallbackList) =
-  var current = callbacks
+  when not defined(nimV2):
+    # strictly speaking a little code duplication here, but we strive
+    # to minimize regressions and I'm not sure I got the 'nimV2' logic
+    # right:
+    var current = callbacks
+    while true:
+      if not current.function.isNil:
+        callSoon(current.function)
+
+      if current.next.isNil:
+        break
+      else:
+        current = current.next[]
+  else:
+    var currentFunc = unown callbacks.function
+    var currentNext = unown callbacks.next
 
-  while true:
-    if not current.function.isNil:
-      callSoon(current.function)
+    while true:
+      if not currentFunc.isNil:
+        callSoon(currentFunc)
 
-    if current.next.isNil:
-      break
-    else:
-      current = current.next[]
+      if currentNext.isNil:
+        break
+      else:
+        currentFunc = currentNext.function
+        currentNext = unown currentNext.next
 
   # callback will be called only once, let GC collect them now
   callbacks.next = nil