summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-04-07 02:02:06 +0200
committerAraq <rumpf_a@web.de>2014-04-07 02:02:06 +0200
commit1b97fcd448c8dea9dbb5cf7418592b973e246410 (patch)
tree5a90de42cc80ca6ab5b4965f3c927144f4f8f8aa
parentd20e4e0df4a384c4b3249eda8a487d998e9eee47 (diff)
parent61c9c429d46b039cc0b3055b5f66981e1f9a94de (diff)
downloadNim-1b97fcd448c8dea9dbb5cf7418592b973e246410.tar.gz
Merge branch 'devel' of https://github.com/Araq/Nimrod into devel
-rw-r--r--doc/lib.txt4
-rw-r--r--lib/pure/asyncdispatch.nim6
-rw-r--r--lib/pure/httpclient.nim3
-rw-r--r--lib/pure/selectors.nim33
-rw-r--r--web/nimrod.ini2
5 files changed, 17 insertions, 31 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 <rawsockets.html>`_
   This module implements a low-level sockets API.
 
+* `selectors <selectors.html>`_
+  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/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)
diff --git a/lib/pure/selectors.nim b/lib/pure/selectors.nim
index 454e77234..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.}
@@ -126,19 +127,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 +222,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 +254,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"