Fix compilation on linux.
This commit is contained in:
parent
d97a397139
commit
d2f130c3fc
1 changed files with 20 additions and 17 deletions
|
|
@ -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,28 +496,29 @@ 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.update(sock, events)
|
||||||
discard p.selector.unregister(sock)
|
|
||||||
else:
|
proc register(p: PDispatcher, sock: TSocketHandle) =
|
||||||
discard p.selector.update(sock, events)
|
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)
|
p.selector[sock].data.PData.readCBs.add(cb)
|
||||||
#echo("registered")
|
p.update(sock, p.selector[sock].events + {EvRead})
|
||||||
else:
|
|
||||||
p.selector[sock].data.PData.readCBs.add(cb)
|
|
||||||
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)
|
p.selector[sock].data.PData.writeCBs.add(cb)
|
||||||
else:
|
p.update(sock, p.selector[sock].events + {EvWrite})
|
||||||
p.selector[sock].data.PData.writeCBs.add(cb)
|
|
||||||
p.update(sock, p.selector[sock].events + {EvWrite})
|
|
||||||
|
|
||||||
proc poll*(p: PDispatcher, timeout = 500) =
|
proc poll*(p: PDispatcher, timeout = 500) =
|
||||||
for info in p.selector.select(timeout):
|
for info in p.selector.select(timeout):
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue