doc generation for asyncdispatch works
This commit is contained in:
parent
5def38ad69
commit
a4ccd7b865
3 changed files with 32 additions and 29 deletions
|
|
@ -154,7 +154,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
let p = getGlobalDispatcher()
|
let p = getGlobalDispatcher()
|
||||||
if CreateIOCompletionPort(sock.THandle, p.ioPort,
|
if CreateIOCompletionPort(sock.THandle, p.ioPort,
|
||||||
cast[TCompletionKey](sock), 1) == 0:
|
cast[TCompletionKey](sock), 1) == 0:
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
p.handles.incl(sock)
|
p.handles.incl(sock)
|
||||||
|
|
||||||
proc verifyPresence(sock: TAsyncFD) =
|
proc verifyPresence(sock: TAsyncFD) =
|
||||||
|
|
@ -191,7 +191,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
lpNumberOfBytesTransferred, TOSErrorCode(-1))
|
lpNumberOfBytesTransferred, TOSErrorCode(-1))
|
||||||
dealloc(customOverlapped)
|
dealloc(customOverlapped)
|
||||||
else:
|
else:
|
||||||
let errCode = OSLastError()
|
let errCode = osLastError()
|
||||||
if lpOverlapped != nil:
|
if lpOverlapped != nil:
|
||||||
assert customOverlapped.data.sock == lpCompletionKey.TAsyncFD
|
assert customOverlapped.data.sock == lpCompletionKey.TAsyncFD
|
||||||
customOverlapped.data.cb(customOverlapped.data.sock,
|
customOverlapped.data.cb(customOverlapped.data.sock,
|
||||||
|
|
@ -201,7 +201,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
if errCode.int32 == WAIT_TIMEOUT:
|
if errCode.int32 == WAIT_TIMEOUT:
|
||||||
# Timed out
|
# Timed out
|
||||||
discard
|
discard
|
||||||
else: OSError(errCode)
|
else: osError(errCode)
|
||||||
|
|
||||||
var connectExPtr: pointer = nil
|
var connectExPtr: pointer = nil
|
||||||
var acceptExPtr: pointer = nil
|
var acceptExPtr: pointer = nil
|
||||||
|
|
@ -218,11 +218,11 @@ when defined(windows) or defined(nimdoc):
|
||||||
proc initAll() =
|
proc initAll() =
|
||||||
let dummySock = newRawSocket()
|
let dummySock = newRawSocket()
|
||||||
if not initPointer(dummySock, connectExPtr, WSAID_CONNECTEX):
|
if not initPointer(dummySock, connectExPtr, WSAID_CONNECTEX):
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
if not initPointer(dummySock, acceptExPtr, WSAID_ACCEPTEX):
|
if not initPointer(dummySock, acceptExPtr, WSAID_ACCEPTEX):
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
if not initPointer(dummySock, getAcceptExSockAddrsPtr, WSAID_GETACCEPTEXSOCKADDRS):
|
if not initPointer(dummySock, getAcceptExSockAddrsPtr, WSAID_GETACCEPTEXSOCKADDRS):
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
|
|
||||||
proc connectEx(s: TSocketHandle, name: ptr TSockAddr, namelen: cint,
|
proc connectEx(s: TSocketHandle, name: ptr TSockAddr, namelen: cint,
|
||||||
lpSendBuffer: pointer, dwSendDataLength: dword,
|
lpSendBuffer: pointer, dwSendDataLength: dword,
|
||||||
|
|
@ -283,7 +283,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
saddr.sin_addr.s_addr = INADDR_ANY
|
saddr.sin_addr.s_addr = INADDR_ANY
|
||||||
if bindAddr(socket.TSocketHandle, cast[ptr TSockAddr](addr(saddr)),
|
if bindAddr(socket.TSocketHandle, cast[ptr TSockAddr](addr(saddr)),
|
||||||
sizeof(saddr).TSockLen) < 0'i32:
|
sizeof(saddr).TSockLen) < 0'i32:
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
|
|
||||||
var aiList = getAddrInfo(address, port, af)
|
var aiList = getAddrInfo(address, port, af)
|
||||||
var success = false
|
var success = false
|
||||||
|
|
@ -314,7 +314,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
# free ``ol``.
|
# free ``ol``.
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
lastError = OSLastError()
|
lastError = osLastError()
|
||||||
if lastError.int32 == ERROR_IO_PENDING:
|
if lastError.int32 == ERROR_IO_PENDING:
|
||||||
# In this case ``ol`` will be deallocated in ``poll``.
|
# In this case ``ol`` will be deallocated in ``poll``.
|
||||||
success = true
|
success = true
|
||||||
|
|
@ -334,7 +334,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
## Reads **up to** ``size`` bytes from ``socket``. Returned future will
|
## Reads **up to** ``size`` bytes from ``socket``. Returned future will
|
||||||
## complete once all the data requested is read, a part of the data has been
|
## complete once all the data requested is read, a part of the data has been
|
||||||
## read, or the socket has disconnected in which case the future will
|
## read, or the socket has disconnected in which case the future will
|
||||||
## complete with a value of ``""`.
|
## complete with a value of ``""``.
|
||||||
|
|
||||||
|
|
||||||
# Things to note:
|
# Things to note:
|
||||||
|
|
@ -370,7 +370,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
let ret = WSARecv(socket.TSocketHandle, addr dataBuf, 1, addr bytesReceived,
|
let ret = WSARecv(socket.TSocketHandle, addr dataBuf, 1, addr bytesReceived,
|
||||||
addr flagsio, cast[POverlapped](ol), nil)
|
addr flagsio, cast[POverlapped](ol), nil)
|
||||||
if ret == -1:
|
if ret == -1:
|
||||||
let err = OSLastError()
|
let err = osLastError()
|
||||||
if err.int32 != ERROR_IO_PENDING:
|
if err.int32 != ERROR_IO_PENDING:
|
||||||
retFuture.fail(newException(EOS, osErrorMsg(err)))
|
retFuture.fail(newException(EOS, osErrorMsg(err)))
|
||||||
dealloc(ol)
|
dealloc(ol)
|
||||||
|
|
@ -449,7 +449,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
var retFuture = newFuture[tuple[address: string, client: TAsyncFD]]()
|
var retFuture = newFuture[tuple[address: string, client: TAsyncFD]]()
|
||||||
|
|
||||||
var clientSock = newRawSocket()
|
var clientSock = newRawSocket()
|
||||||
if clientSock == OSInvalidSocket: osError(osLastError())
|
if clientSock == osInvalidSocket: osError(osLastError())
|
||||||
|
|
||||||
const lpOutputLen = 1024
|
const lpOutputLen = 1024
|
||||||
var lpOutputBuf = newString(lpOutputLen)
|
var lpOutputBuf = newString(lpOutputLen)
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@ import unsigned, os
|
||||||
when hostos == "solaris":
|
when hostos == "solaris":
|
||||||
{.passl: "-lsocket -lnsl".}
|
{.passl: "-lsocket -lnsl".}
|
||||||
|
|
||||||
when defined(Windows):
|
const useWinVersion = defined(Windows) or defined(nimdoc)
|
||||||
|
|
||||||
|
when useWinVersion:
|
||||||
import winlean
|
import winlean
|
||||||
export WSAEWOULDBLOCK
|
export WSAEWOULDBLOCK
|
||||||
else:
|
else:
|
||||||
|
|
@ -74,7 +76,7 @@ type
|
||||||
length*: int
|
length*: int
|
||||||
addrList*: seq[string]
|
addrList*: seq[string]
|
||||||
|
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
let
|
let
|
||||||
osInvalidSocket* = winlean.INVALID_SOCKET
|
osInvalidSocket* = winlean.INVALID_SOCKET
|
||||||
|
|
||||||
|
|
@ -106,7 +108,7 @@ proc toInt*(typ: TType): cint
|
||||||
proc toInt*(p: TProtocol): cint
|
proc toInt*(p: TProtocol): cint
|
||||||
## Converts the TProtocol enum to a platform-dependent ``cint``.
|
## Converts the TProtocol enum to a platform-dependent ``cint``.
|
||||||
|
|
||||||
when defined(posix):
|
when not useWinVersion:
|
||||||
proc toInt(domain: TDomain): cint =
|
proc toInt(domain: TDomain): cint =
|
||||||
case domain
|
case domain
|
||||||
of AF_UNIX: result = posix.AF_UNIX
|
of AF_UNIX: result = posix.AF_UNIX
|
||||||
|
|
@ -150,7 +152,7 @@ proc newRawSocket*(domain: TDomain = AF_INET, typ: TType = SOCK_STREAM,
|
||||||
|
|
||||||
proc close*(socket: TSocketHandle) =
|
proc close*(socket: TSocketHandle) =
|
||||||
## closes a socket.
|
## closes a socket.
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
discard winlean.closeSocket(socket)
|
discard winlean.closeSocket(socket)
|
||||||
else:
|
else:
|
||||||
discard posix.close(socket)
|
discard posix.close(socket)
|
||||||
|
|
@ -164,7 +166,7 @@ proc listen*(socket: TSocketHandle, backlog = SOMAXCONN): cint {.tags: [FReadIO]
|
||||||
## Marks ``socket`` as accepting connections.
|
## Marks ``socket`` as accepting connections.
|
||||||
## ``Backlog`` specifies the maximum length of the
|
## ``Backlog`` specifies the maximum length of the
|
||||||
## queue of pending connections.
|
## queue of pending connections.
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
result = winlean.listen(socket, cint(backlog))
|
result = winlean.listen(socket, cint(backlog))
|
||||||
else:
|
else:
|
||||||
result = posix.listen(socket, cint(backlog))
|
result = posix.listen(socket, cint(backlog))
|
||||||
|
|
@ -181,8 +183,8 @@ proc getAddrInfo*(address: string, port: TPort, af: TDomain = AF_INET, typ: TTyp
|
||||||
hints.ai_protocol = toInt(prot)
|
hints.ai_protocol = toInt(prot)
|
||||||
var gaiResult = getAddrInfo(address, $port, addr(hints), result)
|
var gaiResult = getAddrInfo(address, $port, addr(hints), result)
|
||||||
if gaiResult != 0'i32:
|
if gaiResult != 0'i32:
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
OSError(OSLastError())
|
osError(osLastError())
|
||||||
else:
|
else:
|
||||||
raise newException(EOS, $gai_strerror(gaiResult))
|
raise newException(EOS, $gai_strerror(gaiResult))
|
||||||
|
|
||||||
|
|
@ -224,7 +226,7 @@ proc getServByName*(name, proto: string): TServent {.tags: [FReadIO].} =
|
||||||
## and the protocol name specified by ``proto`` matches the s_proto member.
|
## and the protocol name specified by ``proto`` matches the s_proto member.
|
||||||
##
|
##
|
||||||
## On posix this will search through the ``/etc/services`` file.
|
## On posix this will search through the ``/etc/services`` file.
|
||||||
when defined(Windows):
|
when useWinVersion:
|
||||||
var s = winlean.getservbyname(name, proto)
|
var s = winlean.getservbyname(name, proto)
|
||||||
else:
|
else:
|
||||||
var s = posix.getservbyname(name, proto)
|
var s = posix.getservbyname(name, proto)
|
||||||
|
|
@ -240,7 +242,7 @@ proc getServByPort*(port: TPort, proto: string): TServent {.tags: [FReadIO].} =
|
||||||
## protocol name specified by ``proto`` matches the s_proto member.
|
## protocol name specified by ``proto`` matches the s_proto member.
|
||||||
##
|
##
|
||||||
## On posix this will search through the ``/etc/services`` file.
|
## On posix this will search through the ``/etc/services`` file.
|
||||||
when defined(Windows):
|
when useWinVersion:
|
||||||
var s = winlean.getservbyport(ze(int16(port)).cint, proto)
|
var s = winlean.getservbyport(ze(int16(port)).cint, proto)
|
||||||
else:
|
else:
|
||||||
var s = posix.getservbyport(ze(int16(port)).cint, proto)
|
var s = posix.getservbyport(ze(int16(port)).cint, proto)
|
||||||
|
|
@ -255,7 +257,7 @@ proc getHostByAddr*(ip: string): Thostent {.tags: [FReadIO].} =
|
||||||
var myaddr: TInAddr
|
var myaddr: TInAddr
|
||||||
myaddr.s_addr = inet_addr(ip)
|
myaddr.s_addr = inet_addr(ip)
|
||||||
|
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
var s = winlean.gethostbyaddr(addr(myaddr), sizeof(myaddr).cuint,
|
var s = winlean.gethostbyaddr(addr(myaddr), sizeof(myaddr).cuint,
|
||||||
cint(rawsockets.AF_INET))
|
cint(rawsockets.AF_INET))
|
||||||
if s == nil: osError(osLastError())
|
if s == nil: osError(osLastError())
|
||||||
|
|
@ -267,7 +269,7 @@ proc getHostByAddr*(ip: string): Thostent {.tags: [FReadIO].} =
|
||||||
|
|
||||||
result.name = $s.h_name
|
result.name = $s.h_name
|
||||||
result.aliases = cstringArrayToSeq(s.h_aliases)
|
result.aliases = cstringArrayToSeq(s.h_aliases)
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
result.addrtype = TDomain(s.h_addrtype)
|
result.addrtype = TDomain(s.h_addrtype)
|
||||||
else:
|
else:
|
||||||
if s.h_addrtype == posix.AF_INET:
|
if s.h_addrtype == posix.AF_INET:
|
||||||
|
|
@ -281,14 +283,14 @@ proc getHostByAddr*(ip: string): Thostent {.tags: [FReadIO].} =
|
||||||
|
|
||||||
proc getHostByName*(name: string): Thostent {.tags: [FReadIO].} =
|
proc getHostByName*(name: string): Thostent {.tags: [FReadIO].} =
|
||||||
## This function will lookup the IP address of a hostname.
|
## This function will lookup the IP address of a hostname.
|
||||||
when defined(Windows):
|
when useWinVersion:
|
||||||
var s = winlean.gethostbyname(name)
|
var s = winlean.gethostbyname(name)
|
||||||
else:
|
else:
|
||||||
var s = posix.gethostbyname(name)
|
var s = posix.gethostbyname(name)
|
||||||
if s == nil: osError(osLastError())
|
if s == nil: osError(osLastError())
|
||||||
result.name = $s.h_name
|
result.name = $s.h_name
|
||||||
result.aliases = cstringArrayToSeq(s.h_aliases)
|
result.aliases = cstringArrayToSeq(s.h_aliases)
|
||||||
when defined(windows):
|
when useWinVersion:
|
||||||
result.addrtype = TDomain(s.h_addrtype)
|
result.addrtype = TDomain(s.h_addrtype)
|
||||||
else:
|
else:
|
||||||
if s.h_addrtype == posix.AF_INET:
|
if s.h_addrtype == posix.AF_INET:
|
||||||
|
|
@ -303,7 +305,7 @@ proc getHostByName*(name: string): Thostent {.tags: [FReadIO].} =
|
||||||
proc getSockName*(socket: TSocketHandle): TPort =
|
proc getSockName*(socket: TSocketHandle): TPort =
|
||||||
## returns the socket's associated port number.
|
## returns the socket's associated port number.
|
||||||
var name: Tsockaddr_in
|
var name: Tsockaddr_in
|
||||||
when defined(Windows):
|
when useWinVersion:
|
||||||
name.sin_family = int16(ord(AF_INET))
|
name.sin_family = int16(ord(AF_INET))
|
||||||
else:
|
else:
|
||||||
name.sin_family = posix.AF_INET
|
name.sin_family = posix.AF_INET
|
||||||
|
|
@ -337,7 +339,7 @@ proc setBlocking*(s: TSocketHandle, blocking: bool) =
|
||||||
## Sets blocking mode on socket.
|
## Sets blocking mode on socket.
|
||||||
##
|
##
|
||||||
## Raises EOS on error.
|
## Raises EOS on error.
|
||||||
when defined(Windows):
|
when useWinVersion:
|
||||||
var mode = clong(ord(not blocking)) # 1 for non-blocking, 0 for blocking
|
var mode = clong(ord(not blocking)) # 1 for non-blocking, 0 for blocking
|
||||||
if ioctlsocket(s, FIONBIO, addr(mode)) == -1:
|
if ioctlsocket(s, FIONBIO, addr(mode)) == -1:
|
||||||
osError(osLastError())
|
osError(osLastError())
|
||||||
|
|
@ -418,4 +420,4 @@ proc selectWrite*(writefds: var seq[TSocketHandle],
|
||||||
|
|
||||||
when defined(Windows):
|
when defined(Windows):
|
||||||
var wsa: TWSADATA
|
var wsa: TWSADATA
|
||||||
if WSAStartup(0x0101'i16, addr wsa) != 0: OSError(OSLastError())
|
if WSAStartup(0x0101'i16, addr wsa) != 0: osError(osLastError())
|
||||||
|
|
|
||||||
|
|
@ -176,9 +176,10 @@ proc rawEchoNL() {.inline, compilerproc.} = write(stdout, "\n")
|
||||||
|
|
||||||
# interface to the C procs:
|
# interface to the C procs:
|
||||||
|
|
||||||
when defined(windows) and not defined(useWinAnsi):
|
when (defined(windows) and not defined(useWinAnsi)) or defined(nimdoc):
|
||||||
include "system/widestrs"
|
include "system/widestrs"
|
||||||
|
|
||||||
|
when defined(windows) and not defined(useWinAnsi):
|
||||||
proc wfopen(filename, mode: WideCString): pointer {.
|
proc wfopen(filename, mode: WideCString): pointer {.
|
||||||
importc: "_wfopen", nodecl.}
|
importc: "_wfopen", nodecl.}
|
||||||
proc wfreopen(filename, mode: WideCString, stream: TFile): TFile {.
|
proc wfreopen(filename, mode: WideCString, stream: TFile): TFile {.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue