diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-04-05 23:10:51 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-04-05 23:10:51 +0100 |
commit | 51c203bab096eb739734208358d6c8aec3b5da1f (patch) | |
tree | 3e95c131a5e12e6c5a04ef2f20059913e9f60915 /lib | |
parent | cd70bba332cffe51dd359b339ea6a40eff543ce9 (diff) | |
download | Nim-51c203bab096eb739734208358d6c8aec3b5da1f.tar.gz |
Modified behaviour of checkBuffer to match new select behaviour. Refs #822.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/irc.nim | 1 | ||||
-rw-r--r-- | lib/pure/sockets.nim | 28 |
2 files changed, 14 insertions, 15 deletions
diff --git a/lib/pure/irc.nim b/lib/pure/irc.nim index c1b519b0b..83fb231f6 100644 --- a/lib/pure/irc.nim +++ b/lib/pure/irc.nim @@ -346,6 +346,7 @@ proc poll*(irc: PIRC, ev: var TIRCEvent, var line = TaintedString"" var socks = @[irc.sock] var ret = socks.select(timeout) + if ret == -1: osError(osLastError()) if socks.len() != 0 and ret != 0: irc.sock.readLine(line) ev = irc.processLine(line.string) diff --git a/lib/pure/sockets.nim b/lib/pure/sockets.nim index 76d37879b..d978e99b1 100644 --- a/lib/pure/sockets.nim +++ b/lib/pure/sockets.nim @@ -925,16 +925,13 @@ proc createFdSet(fd: var TFdSet, s: seq[TSocket], m: var int) = m = max(m, int(i.fd)) FD_SET(i.fd, fd) -proc pruneSocketSet(s: var seq[TSocket], fd: var TFdSet) = - var i = 0 - var L = s.len - while i < L: - if FD_ISSET(s[i].fd, fd) == 0'i32: - s[i] = s[L-1] - dec(L) - else: - inc(i) - setLen(s, L) +proc pruneSocketSet(s: var seq[TSocket], fd: var TFdSet) = + var newSet: seq[TSocket] = @[] + for sock in s: + if FD_ISSET(sock.fd, fd) == 1'i32: + ## Is set. + newSet.add(sock) + s = newSet proc hasDataBuffered*(s: TSocket): bool = ## Determines whether a socket has data buffered. @@ -954,9 +951,9 @@ proc checkBuffer(readfds: var seq[TSocket]): int = for s in readfds: if hasDataBuffered(s): inc(result) - else: res.add(s) - readfds = res + if result > 0: + readfds = res proc select*(readfds, writefds, exceptfds: var seq[TSocket], timeout = 500): int {.tags: [FReadIO].} = @@ -965,8 +962,9 @@ proc select*(readfds, writefds, exceptfds: var seq[TSocket], ## If there are none; 0 is returned. ## ``Timeout`` is in miliseconds and -1 can be specified for no timeout. ## - ## A socket is removed from the specific ``seq`` when it has data waiting to - ## be read/written to or has errors (``exceptfds``). + ## Sockets which are **not** ready for reading, writing or which don't have + ## errors waiting on them are removed from the ``readfds``, ``writefds``, + ## ``exceptfds`` sequences respectively. let buffersFilled = checkBuffer(readfds) if buffersFilled > 0: return buffersFilled @@ -1013,7 +1011,7 @@ proc selectWrite*(writefds: var seq[TSocket], timeout = 500): int {.tags: [FReadIO].} = ## When a socket in ``writefds`` is ready to be written to then a non-zero ## value will be returned specifying the count of the sockets which can be - ## written to. The sockets which can be written to will also be removed + ## written to. The sockets which **cannot** be written to will also be removed ## from ``writefds``. ## ## ``timeout`` is specified in miliseconds and ``-1`` can be specified for |