summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2016-11-19 20:06:23 +0100
committerDominik Picheta <dominikpicheta@gmail.com>2016-11-19 20:06:23 +0100
commitd847d350097a36a6008fbb7ce056f470725a29a7 (patch)
treeebf9f902448fc4b4e24715aa66a83099588a6a12
parent9ca3ae14ab5d4bff1c5016a2919414c720bb82f8 (diff)
downloadNim-d847d350097a36a6008fbb7ce056f470725a29a7.tar.gz
Async: Further callbacks will no longer be called after an EAGAIN.
For context, see discussion here https://gitter.im/nim-lang/Nim?at=583090a2df9f0f6e7f576e43 or here http://irclogs.nim-lang.org/19-11-2016.html#17:30:59.
-rw-r--r--lib/pure/asyncdispatch.nim18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim
index 8c4a0e41d..58028847e 100644
--- a/lib/pure/asyncdispatch.nim
+++ b/lib/pure/asyncdispatch.nim
@@ -1062,17 +1062,27 @@ else:
           let currentCBs = data.readCBs
           data.readCBs = @[]
           for cb in currentCBs:
-            if not cb(data.fd):
-              # Callback wants to be called again.
+            if data.readCBs.len > 0:
+              # A callback has already returned with EAGAIN, don't call any
+              # others until next `poll`.
               data.readCBs.add(cb)
+            else:
+              if not cb(data.fd):
+                # Callback wants to be called again.
+                data.readCBs.add(cb)
 
         if EvWrite in info.events or info.events == {EvError}:
           let currentCBs = data.writeCBs
           data.writeCBs = @[]
           for cb in currentCBs:
-            if not cb(data.fd):
-              # Callback wants to be called again.
+            if data.writeCBs.len > 0:
+              # A callback has already returned with EAGAIN, don't call any
+              # others until next `poll`.
               data.writeCBs.add(cb)
+            else:
+              if not cb(data.fd):
+                # Callback wants to be called again.
+                data.writeCBs.add(cb)
 
         if info.key in p.selector:
           var newEvents: set[Event]