Fix compilation on linux.

This commit is contained in:
Dominik Picheta 2014-03-12 23:19:40 +00:00
commit d2f130c3fc

View file

@ -132,6 +132,7 @@ when defined(windows) or defined(nimdoc):
cast[TCompletionKey](sock), 1) == 0: cast[TCompletionKey](sock), 1) == 0:
OSError(OSLastError()) OSError(OSLastError())
p.handles.incl(sock) p.handles.incl(sock)
# TODO: fd closure detection, we need to remove the fd from handles set
proc verifyPresence(p: PDispatcher, sock: TSocketHandle) = proc verifyPresence(p: PDispatcher, sock: TSocketHandle) =
## Ensures that socket has been registered with the dispatcher. ## Ensures that socket has been registered with the dispatcher.
@ -471,7 +472,7 @@ when defined(windows) or defined(nimdoc):
typ: TType = SOCK_STREAM, typ: TType = SOCK_STREAM,
protocol: TProtocol = IPPROTO_TCP): TSocketHandle = protocol: TProtocol = IPPROTO_TCP): TSocketHandle =
## Creates a new socket and registers it with the dispatcher implicitly. ## Creates a new socket and registers it with the dispatcher implicitly.
result = socket() result = socket(domain, typ, protocol)
disp.register(result) disp.register(result)
initAll() initAll()
@ -495,26 +496,27 @@ else:
proc update(p: PDispatcher, sock: TSocketHandle, events: set[TEvent]) = proc update(p: PDispatcher, sock: TSocketHandle, events: set[TEvent]) =
assert sock in p.selector 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) = proc addRead(p: PDispatcher, sock: TSocketHandle, cb: TCallback) =
#echo("addRead")
if sock notin p.selector: if sock notin p.selector:
var data = PData(sock: sock, readCBs: @[cb], writeCBs: @[]) raise newException(EInvalidValue, "File descriptor not registered.")
p.selector.register(sock, {EvRead}, data.PObject)
#echo("registered")
else:
p.selector[sock].data.PData.readCBs.add(cb) p.selector[sock].data.PData.readCBs.add(cb)
p.update(sock, p.selector[sock].events + {EvRead}) p.update(sock, p.selector[sock].events + {EvRead})
proc addWrite(p: PDispatcher, sock: TSocketHandle, cb: TCallback) = proc addWrite(p: PDispatcher, sock: TSocketHandle, cb: TCallback) =
if sock notin p.selector: if sock notin p.selector:
var data = PData(sock: sock, readCBs: @[], writeCBs: @[cb]) raise newException(EInvalidValue, "File descriptor not registered.")
p.selector.register(sock, {EvWrite}, data.PObject)
else:
p.selector[sock].data.PData.writeCBs.add(cb) p.selector[sock].data.PData.writeCBs.add(cb)
p.update(sock, p.selector[sock].events + {EvWrite}) p.update(sock, p.selector[sock].events + {EvWrite})
@ -667,6 +669,7 @@ else:
else: else:
retFuture.fail(newException(EOS, osErrorMsg(lastError))) retFuture.fail(newException(EOS, osErrorMsg(lastError)))
else: else:
p.register(client)
retFuture.complete(($inet_ntoa(sockAddress.sin_addr), client)) retFuture.complete(($inet_ntoa(sockAddress.sin_addr), client))
addRead(p, socket, cb) addRead(p, socket, cb)
return retFuture return retFuture