summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJulian Fondren <julian.fondren@gmail.com>2019-05-15 19:57:45 -0500
committerJulian Fondren <julian.fondren@gmail.com>2019-05-15 19:57:45 -0500
commit22b4cf192d48ca2e689aa31e7714f76964f8fd92 (patch)
tree865f6cd3eafdc8617db410309e1a4acaaa4c5f15
parente26545797e23b40cd857f7ccba63919cb87ed51b (diff)
downloadNim-22b4cf192d48ca2e689aa31e7714f76964f8fd92.tar.gz
fix for unnecessary poll() in some uses of async
-rw-r--r--lib/pure/asyncstreams.nim7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/pure/asyncstreams.nim b/lib/pure/asyncstreams.nim
index 57800ce10..f470d5b61 100644
--- a/lib/pure/asyncstreams.nim
+++ b/lib/pure/asyncstreams.nim
@@ -79,7 +79,7 @@ proc read*[T](future: FutureStream[T]): Future[(bool, T)] =
   ## ``FutureStream``.
   var resFut = newFuture[(bool, T)]("FutureStream.take")
   let savedCb = future.cb
-  future.callback =
+  var newCb =
     proc (fs: FutureStream[T]) =
       # Exit early if `resFut` is already complete. (See #8994).
       if resFut.finished: return
@@ -100,6 +100,11 @@ proc read*[T](future: FutureStream[T]): Future[(bool, T)] =
 
       # If the saved callback isn't nil then let's call it.
       if not savedCb.isNil: savedCb()
+
+  if future.queue.len > 0 or future.finished:
+    newCb(future)
+  else:
+    future.callback = newCb
   return resFut
 
 proc len*[T](future: FutureStream[T]): int =