diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2015-07-26 22:03:48 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2015-07-26 22:03:48 +0100 |
commit | bd6e223065a409c5e2527f989382e250d47da5f8 (patch) | |
tree | 827db30d5dae7802517befcb3214b723b61cfd82 /lib | |
parent | 1b9f2fdfe87da150651dea396aa1d23303fab878 (diff) | |
parent | a11a2f0fdb3ecdd995e4fc1a6cb41de4e7fc12f2 (diff) | |
download | Nim-bd6e223065a409c5e2527f989382e250d47da5f8.tar.gz |
Merge branch 'async_callback_issue_0412' of https://github.com/l04m33/Nim into l04m33-async_callback_issue_0412-2
Conflicts: lib/pure/asyncdispatch.nim
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/asyncdispatch.nim | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 2ce31b4e8..7523b29d5 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -972,9 +972,9 @@ else: let data = PData(info.key.data) assert data.fd == info.key.fd.AsyncFD #echo("In poll ", data.fd.cint) - if EvError in info.events: - closeSocket(data.fd) - continue + # There may be EvError here, but we handle them in callbacks, + # so that exceptions can be raised from `send(...)` and + # `recv(...)` routines. if EvRead in info.events: # Callback may add items to ``data.readCBs`` which causes issues if @@ -1013,9 +1013,17 @@ else: var retFuture = newFuture[void]("connect") proc cb(fd: AsyncFD): bool = - # We have connected. - retFuture.complete() - return true + var ret = SocketHandle(fd).getSockOptInt(cint(SOL_SOCKET), cint(SO_ERROR)) + if ret == 0: + # We have connected. + retFuture.complete() + return true + elif ret == EINTR: + # interrupted, keep waiting + return false + else: + retFuture.fail(newException(OSError, osErrorMsg(OSErrorCode(ret)))) + return true assert getSockDomain(socket.SocketHandle) == domain var aiList = getAddrInfo(address, port, domain) |