summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcheatfate <ka@hardcore.kiev.ua>2017-01-28 10:34:13 +0200
committercheatfate <ka@hardcore.kiev.ua>2017-01-28 10:34:13 +0200
commit210ac5c1383ec4f3680c5da3fadb75cf4153b0bf (patch)
treedded22da50cfd3f4fedb7ce8ee43aa6016323e82
parentefe65e2255f19dbb077c8176cea2b8f99957f661 (diff)
downloadNim-210ac5c1383ec4f3680c5da3fadb75cf4153b0bf.tar.gz
One more fix for #5290.
-rw-r--r--lib/pure/ioselects/ioselectors_kqueue.nim19
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/pure/ioselects/ioselectors_kqueue.nim b/lib/pure/ioselects/ioselectors_kqueue.nim
index bb94ea172..3d2aae180 100644
--- a/lib/pure/ioselects/ioselectors_kqueue.nim
+++ b/lib/pure/ioselects/ioselectors_kqueue.nim
@@ -93,6 +93,16 @@ proc newSelector*[T](): Selector[T] =
   if kqFD < 0:
     raiseIOSelectorsError(osLastError())
 
+  # we allocating empty socket to duplicate it handle in future, to get unique
+  # indexes for `fds` array. This is needed to properly identify
+  # {Event.Timer, Event.Signal, Event.Process} events.
+  let usock = posix.socket(posix.AF_INET, posix.SOCK_STREAM,
+                             posix.IPPROTO_TCP).cint
+  if usock == -1:
+    let err = osLastError()
+    discard posix.close(kqFD)
+    raiseIOSelectorsError(err)
+
   when hasThreadSupport:
     result = cast[Selector[T]](allocShared0(sizeof(SelectorImpl[T])))
     result.fds = allocSharedArray[SelectorKey[T]](maxFD)
@@ -104,17 +114,10 @@ proc newSelector*[T](): Selector[T] =
     result.fds = newSeq[SelectorKey[T]](maxFD)
     result.changes = newSeqOfCap[KEvent](MAX_KQUEUE_EVENTS)
 
+  result.sock = usock
   result.kqFD = kqFD
   result.maxFD = maxFD.int
 
-  # we allocating empty socket to duplicate it handle in future, to get unique
-  # indexes for `fds` array. This is needed to properly identify
-  # {Event.Timer, Event.Signal, Event.Process} events.
-  result.sock = posix.socket(posix.AF_INET, posix.SOCK_STREAM,
-                             posix.IPPROTO_TCP).cint
-  if result.sock == -1:
-    raiseIOSelectorsError(osLastError())
-
 proc close*[T](s: Selector[T]) =
   let res = posix.close(s.kqFD)
   when hasThreadSupport: