summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2015-07-26 22:03:48 +0100
committerDominik Picheta <dominikpicheta@googlemail.com>2015-07-26 22:03:48 +0100
commitbd6e223065a409c5e2527f989382e250d47da5f8 (patch)
tree827db30d5dae7802517befcb3214b723b61cfd82 /lib
parent1b9f2fdfe87da150651dea396aa1d23303fab878 (diff)
parenta11a2f0fdb3ecdd995e4fc1a6cb41de4e7fc12f2 (diff)
downloadNim-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.nim20
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)