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.
This commit is contained in:
Dominik Picheta
2016-11-19 20:06:23 +01:00
parent 9ca3ae14ab
commit d847d35009

View File

@@ -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]