diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2017-11-22 14:43:10 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-11-22 15:43:10 +0100 |
commit | d3394be5559c324da1c6b576d0ae9bfa966698d9 (patch) | |
tree | 72698b80e6045f35f783abe55405500b19808475 /lib/pure/ioselects/ioselectors_select.nim | |
parent | 2c584cdb3d71f0cd811e3774c49db34735040032 (diff) | |
download | Nim-d3394be5559c324da1c6b576d0ae9bfa966698d9.tar.gz |
Async upcoming (#6585)
* Merge upcoming async with current. * Various improvements to selectors (mostly docs). Two changes to highlight: * Renamed ``setEvent`` to ``trigger`` * Reused setBlocking from nativesockets. * Various changes/fixes to asyncdispatch after upcoming merge. * Make some attempts to be compatible with older selectors. * Reuse epoll module in ioselectors_epoll.
Diffstat (limited to 'lib/pure/ioselects/ioselectors_select.nim')
-rw-r--r-- | lib/pure/ioselects/ioselectors_select.nim | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/pure/ioselects/ioselectors_select.nim b/lib/pure/ioselects/ioselectors_select.nim index dc3451d52..017d08117 100644 --- a/lib/pure/ioselects/ioselectors_select.nim +++ b/lib/pure/ioselects/ioselectors_select.nim @@ -154,7 +154,7 @@ when defined(windows): result.rsock = rsock result.wsock = wsock - proc setEvent*(ev: SelectEvent) = + proc trigger*(ev: SelectEvent) = var data: uint64 = 1 if winlean.send(ev.wsock, cast[pointer](addr data), cint(sizeof(uint64)), 0) != sizeof(uint64): @@ -178,7 +178,7 @@ else: result.rsock = SocketHandle(fds[0]) result.wsock = SocketHandle(fds[1]) - proc setEvent*(ev: SelectEvent) = + proc trigger*(ev: SelectEvent) = var data: uint64 = 1 if posix.write(cint(ev.wsock), addr data, sizeof(uint64)) != sizeof(uint64): raiseIOSelectorsError(osLastError()) @@ -379,6 +379,16 @@ proc flush*[T](s: Selector[T]) = discard template isEmpty*[T](s: Selector[T]): bool = (s.count == 0) +proc contains*[T](s: Selector[T], fd: SocketHandle|int): bool {.inline.} = + s.withSelectLock(): + result = false + + let fdi = int(fd) + for i in 0..<FD_SETSIZE: + if s.fds[i].ident == fdi: + return true + inc(i) + when hasThreadSupport: template withSelectLock[T](s: Selector[T], body: untyped) = acquire(s.lock) @@ -391,15 +401,12 @@ else: template withSelectLock[T](s: Selector[T], body: untyped) = body -proc getData*[T](s: Selector[T], fd: SocketHandle|int): T = +proc getData*[T](s: Selector[T], fd: SocketHandle|int): var T = s.withSelectLock(): let fdi = int(fd) - var i = 0 - while i < FD_SETSIZE: + for i in 0..<FD_SETSIZE: if s.fds[i].ident == fdi: - result = s.fds[i].data - break - inc(i) + return s.fds[i].data proc setData*[T](s: Selector[T], fd: SocketHandle|int, data: T): bool = s.withSelectLock(): |