summary refs log tree commit diff stats
path: root/lib/upcoming
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2016-09-17 14:19:26 +0200
committerDominik Picheta <dominikpicheta@gmail.com>2016-09-17 14:19:26 +0200
commit75e5c87f1525d5c5ea59005bc458ff6f561a27c9 (patch)
treea9d84d4f572bf773a855029496d3acb388592b00 /lib/upcoming
parent5bf16439e1eddb93b4c9177530ca6640a32de42b (diff)
downloadNim-75e5c87f1525d5c5ea59005bc458ff6f561a27c9.tar.gz
Fixes #4170.
Diffstat (limited to 'lib/upcoming')
-rw-r--r--lib/upcoming/asyncdispatch.nim33
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/upcoming/asyncdispatch.nim b/lib/upcoming/asyncdispatch.nim
index 689d0272c..460dfbd1a 100644
--- a/lib/upcoming/asyncdispatch.nim
+++ b/lib/upcoming/asyncdispatch.nim
@@ -339,17 +339,22 @@ proc `and`*[T, Y](fut1: Future[T], fut2: Future[Y]): Future[void] =
   var retFuture = newFuture[void]("asyncdispatch.`and`")
   fut1.callback =
     proc () =
-      if fut2.finished: retFuture.complete()
+      if not retFuture.finished:
+        if fut1.failed: retFuture.fail(fut1.error)
+        elif fut2.finished: retFuture.complete()
   fut2.callback =
     proc () =
-      if fut1.finished: retFuture.complete()
+      if not retFuture.finished:
+        if fut2.failed: retFuture.fail(fut2.error)
+        elif fut1.finished: retFuture.complete()
   return retFuture
 
 proc `or`*[T, Y](fut1: Future[T], fut2: Future[Y]): Future[void] =
   ## Returns a future which will complete once either ``fut1`` or ``fut2``
   ## complete.
   var retFuture = newFuture[void]("asyncdispatch.`or`")
-  proc cb() =
+  proc cb(fut: Future[T]) =
+    if fut.failed: retFuture.fail(fut.error)
     if not retFuture.finished: retFuture.complete()
   fut1.callback = cb
   fut2.callback = cb
@@ -374,10 +379,13 @@ proc all*[T](futs: varargs[Future[T]]): auto =
 
     for fut in futs:
       fut.callback = proc(f: Future[T]) =
-        inc(completedFutures)
+        if f.failed:
+          retFuture.fail(f.error)
+        elif not retFuture.finished:
+          inc(completedFutures)
 
-        if completedFutures == totalFutures:
-          retFuture.complete()
+          if completedFutures == totalFutures:
+            retFuture.complete()
 
     return retFuture
 
@@ -390,11 +398,14 @@ proc all*[T](futs: varargs[Future[T]]): auto =
     for i, fut in futs:
       proc setCallback(i: int) =
         fut.callback = proc(f: Future[T]) =
-          retValues[i] = f.read()
-          inc(completedFutures)
-
-          if completedFutures == len(retValues):
-            retFuture.complete(retValues)
+          if f.failed:
+            retFuture.fail(f.error)
+          elif not retFuture.finished:
+            retValues[i] = f.read()
+            inc(completedFutures)
+
+            if completedFutures == len(retValues):
+              retFuture.complete(retValues)
 
       setCallback(i)