diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2016-11-19 20:06:23 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2016-11-19 20:06:23 +0100 |
commit | d847d350097a36a6008fbb7ce056f470725a29a7 (patch) | |
tree | ebf9f902448fc4b4e24715aa66a83099588a6a12 /lib | |
parent | 9ca3ae14ab5d4bff1c5016a2919414c720bb82f8 (diff) | |
download | Nim-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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/asyncdispatch.nim | 18 |
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] |