doc generation for asyncdispatch works

This commit is contained in:
Araq 2014-04-06 19:36:29 +02:00
commit a4ccd7b865
3 changed files with 32 additions and 29 deletions

View file

@ -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)

View file

@ -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())

View file

@ -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 {.