From d98b0d9f795969e594e95b9b3d0e0f56ee1f7c41 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sun, 6 Apr 2014 21:43:51 +0100 Subject: [PATCH 1/3] Selectors module now uses select on operating systems other than Linux. --- doc/lib.txt | 4 ++++ lib/pure/selectors.nim | 32 +++++++++----------------------- web/nimrod.ini | 2 +- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/doc/lib.txt b/doc/lib.txt index 92ca18ea1..62efe6a5d 100644 --- a/doc/lib.txt +++ b/doc/lib.txt @@ -247,6 +247,10 @@ Internet Protocols and Support * `rawsockets `_ This module implements a low-level sockets API. +* `selectors `_ + This module implements a selector API with backends specific to each OS. + Currently epoll on Linux and select on other operating systems. + Parsers ------- diff --git a/lib/pure/selectors.nim b/lib/pure/selectors.nim index 454e77234..8085131f5 100644 --- a/lib/pure/selectors.nim +++ b/lib/pure/selectors.nim @@ -126,19 +126,12 @@ when defined(linux) or defined(nimdoc): else: return false - proc contains*(s: PSelector, key: PSelectorKey): bool = - ## Determines whether selector contains this selector key. More accurate - ## than checking if the file descriptor is in the selector because it - ## ensures that the keys are equal. File descriptors may not always be - ## unique especially when an fd is closed and then a new one is opened, - ## the new one may have the same value. - return key.fd in s and s.fds[key.fd] == key - proc `[]`*(s: PSelector, fd: TSocketHandle): PSelectorKey = ## Retrieves the selector key for ``fd``. return s.fds[fd] -elif defined(windows): +else: + # TODO: kqueue for bsd/mac os x. type PSelector* = ref object fds: TTable[TSocketHandle, PSelectorKey] @@ -228,11 +221,13 @@ elif defined(windows): proc `[]`*(s: PSelector, fd: TSocketHandle): PSelectorKey = return s.fds[fd] -elif defined(bsd) or defined(macosx): - # TODO: kqueue - {.error: "Sorry your platform is not supported yet.".} -else: - {.error: "Sorry your platform is not supported.".} +proc contains*(s: PSelector, key: PSelectorKey): bool = + ## Determines whether selector contains this selector key. More accurate + ## than checking if the file descriptor is in the selector because it + ## ensures that the keys are equal. File descriptors may not always be + ## unique especially when an fd is closed and then a new one is opened, + ## the new one may have the same value. + return key.fd in s and s.fds[key.fd] == key when isMainModule: # Select() @@ -258,12 +253,3 @@ when isMainModule: assert selector.unregister(sock.getFD).fd == sock.getFD selector.close() break - - - - - - - - - diff --git a/web/nimrod.ini b/web/nimrod.ini index 3160dc666..b29bcff30 100644 --- a/web/nimrod.ini +++ b/web/nimrod.ini @@ -63,7 +63,7 @@ srcdoc2: "pure/asyncio;pure/actors;core/locks;pure/oids;pure/endians;pure/uri" srcdoc2: "pure/nimprof;pure/unittest;packages/docutils/highlite" srcdoc2: "packages/docutils/rst;packages/docutils/rstast" srcdoc2: "packages/docutils/rstgen;pure/logging;pure/asyncdispatch;pure/asyncnet" -srcdoc2: "pure/rawsockets;pure/asynchttpserver;pure/net" +srcdoc2: "pure/rawsockets;pure/asynchttpserver;pure/net;pure/selectors" webdoc: "wrappers/libcurl;pure/md5;wrappers/mysql;wrappers/iup" webdoc: "wrappers/sqlite3;wrappers/postgres;wrappers/tinyc" From d2593e1d62ead59342490f1feae9322106afb018 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sun, 6 Apr 2014 22:06:25 +0100 Subject: [PATCH 2/3] setLen now used on asyncdispatch.recv's return value on Linux. This fixes issues with the async httpclient. --- lib/pure/asyncdispatch.nim | 6 ++---- lib/pure/httpclient.nim | 3 --- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 2c0f5ee61..ef2bab875 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -664,8 +664,7 @@ else: var retFuture = newFuture[string]() var readBuffer = newString(size) - var sizeRead = 0 - + proc cb(sock: TAsyncFD): bool = result = true let res = recv(sock.TSocketHandle, addr readBuffer[0], size, @@ -678,12 +677,11 @@ else: else: result = false # We still want this callback to be called. elif res == 0: - #echo("Disconnected recv: ", sizeRead) # Disconnected retFuture.complete("") else: + readBuffer.setLen(res) retFuture.complete(readBuffer) - #echo("Recv cb result: ", result) addRead(socket, cb) return retFuture diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 1e3a1032c..2a145eb89 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -546,9 +546,6 @@ proc parseResponse(client: PAsyncHttpClient, # Parse HTTP version info and status code. var le = skipIgnoreCase(line, "HTTP/", linei) if le <= 0: - while true: - let nl = await client.socket.recvLine() - echo("Got another line: ", nl) httpError("invalid http version, " & line.repr) inc(linei, le) le = skipIgnoreCase(line, "1.1", linei) From 61c9c429d46b039cc0b3055b5f66981e1f9a94de Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sun, 6 Apr 2014 23:20:55 +0100 Subject: [PATCH 3/3] Fixes selectors module on Mac OS X. --- lib/pure/selectors.nim | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pure/selectors.nim b/lib/pure/selectors.nim index 8085131f5..a4a7b5afd 100644 --- a/lib/pure/selectors.nim +++ b/lib/pure/selectors.nim @@ -13,6 +13,7 @@ import tables, os, unsigned, hashes when defined(linux): import posix, epoll elif defined(windows): import winlean +else: import posix proc hash*(x: TSocketHandle): THash {.borrow.} proc `$`*(x: TSocketHandle): string {.borrow.}