From d847d350097a36a6008fbb7ce056f470725a29a7 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sat, 19 Nov 2016 20:06:23 +0100 Subject: [PATCH] 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. --- lib/pure/asyncdispatch.nim | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 8c4a0e41d9..58028847e5 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]