diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-03-12 23:19:40 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-03-12 23:19:40 +0000 |
commit | d2f130c3fc1ffa786e8d323c3cd3c51fd45124da (patch) | |
tree | c15fe9efa8e4847180f76624043d21166c2bad35 | |
parent | d97a397139a6e7fdae6f3ec887ec5d76ef681b2c (diff) | |
download | Nim-d2f130c3fc1ffa786e8d323c3cd3c51fd45124da.tar.gz |
Fix compilation on linux.
-rw-r--r-- | lib/pure/asyncio2.nim | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/lib/pure/asyncio2.nim b/lib/pure/asyncio2.nim index c15415130..c37370b7b 100644 --- a/lib/pure/asyncio2.nim +++ b/lib/pure/asyncio2.nim @@ -132,6 +132,7 @@ when defined(windows) or defined(nimdoc): cast[TCompletionKey](sock), 1) == 0: OSError(OSLastError()) p.handles.incl(sock) + # TODO: fd closure detection, we need to remove the fd from handles set proc verifyPresence(p: PDispatcher, sock: TSocketHandle) = ## Ensures that socket has been registered with the dispatcher. @@ -471,7 +472,7 @@ when defined(windows) or defined(nimdoc): typ: TType = SOCK_STREAM, protocol: TProtocol = IPPROTO_TCP): TSocketHandle = ## Creates a new socket and registers it with the dispatcher implicitly. - result = socket() + result = socket(domain, typ, protocol) disp.register(result) initAll() @@ -495,28 +496,29 @@ else: proc update(p: PDispatcher, sock: TSocketHandle, events: set[TEvent]) = assert sock in p.selector - if events == {}: - discard p.selector.unregister(sock) - else: - discard p.selector.update(sock, events) + discard p.selector.update(sock, events) + + proc register(p: PDispatcher, sock: TSocketHandle) = + var data = PData(sock: sock, readCBs: @[], writeCBs: @[]) + p.selector.register(sock, {}, data.PObject) + + proc socket*(disp: PDispatcher, domain: TDomain = AF_INET, + typ: TType = SOCK_STREAM, + protocol: TProtocol = IPPROTO_TCP): TSocketHandle = + result = socket(domain, typ, protocol) + disp.register(result) proc addRead(p: PDispatcher, sock: TSocketHandle, cb: TCallback) = - #echo("addRead") if sock notin p.selector: - var data = PData(sock: sock, readCBs: @[cb], writeCBs: @[]) - p.selector.register(sock, {EvRead}, data.PObject) - #echo("registered") - else: - p.selector[sock].data.PData.readCBs.add(cb) - p.update(sock, p.selector[sock].events + {EvRead}) + raise newException(EInvalidValue, "File descriptor not registered.") + p.selector[sock].data.PData.readCBs.add(cb) + p.update(sock, p.selector[sock].events + {EvRead}) proc addWrite(p: PDispatcher, sock: TSocketHandle, cb: TCallback) = if sock notin p.selector: - var data = PData(sock: sock, readCBs: @[], writeCBs: @[cb]) - p.selector.register(sock, {EvWrite}, data.PObject) - else: - p.selector[sock].data.PData.writeCBs.add(cb) - p.update(sock, p.selector[sock].events + {EvWrite}) + raise newException(EInvalidValue, "File descriptor not registered.") + p.selector[sock].data.PData.writeCBs.add(cb) + p.update(sock, p.selector[sock].events + {EvWrite}) proc poll*(p: PDispatcher, timeout = 500) = for info in p.selector.select(timeout): @@ -667,6 +669,7 @@ else: else: retFuture.fail(newException(EOS, osErrorMsg(lastError))) else: + p.register(client) retFuture.complete(($inet_ntoa(sockAddress.sin_addr), client)) addRead(p, socket, cb) return retFuture |