Fix loop behavior.

This commit is contained in:
cheatfate 2018-05-23 14:03:18 +03:00
parent 608924d9f4
commit 4f70cb3515
3 changed files with 24 additions and 7 deletions

View File

@ -33,3 +33,7 @@ task test, "Run all tests":
exec "nim c -r -d:useSysAssert -d:useGcAssert tests/teststream"
exec "nim c -r tests/teststream"
exec "nim c -r -d:release tests/teststream"
exec "nim c -r -d:useSysAssert -d:useGcAssert tests/teststream2"
exec "nim c -r tests/teststream2"
exec "nim c -r -d:release tests/teststream2"

View File

@ -278,6 +278,9 @@ when defined(windows) or defined(nimdoc):
if curTimeout == 0:
if len(loop.callbacks) == 0:
curTimeout = INFINITE
else:
if len(loop.callbacks) != 0:
curTimeout = 0
# Processing handles
var lpNumberOfBytesTransferred: Dword
@ -519,6 +522,9 @@ else:
if curTimeout == 0:
if len(loop.callbacks) == 0:
curTimeout = -1
else:
if len(loop.callbacks) != 0:
curTimeout = 0
count = loop.selector.selectInto(curTimeout, loop.keys)
for i in 0..<count:

View File

@ -36,7 +36,7 @@ type
type
StreamTransport* = ref object of RootRef
fd: AsyncFD # File descriptor
fd*: AsyncFD # File descriptor
state: set[TransportState] # Current Transport state
reader: Future[void] # Current reader Future
buffer: seq[byte] # Reading buffer
@ -433,6 +433,9 @@ when defined(windows):
retFuture.fail(newException(OSError, osErrorMsg(osLastError())))
else:
retFuture.complete(sock)
elif int32(ovl.data.errCode) == ERROR_OPERATION_ABORTED:
sock.closeAsyncSocket()
retFuture.complete(asyncInvalidSocket)
else:
sock.closeAsyncSocket()
retFuture.fail(newException(OSError, osErrorMsg(ovl.data.errCode)))
@ -462,6 +465,7 @@ when defined(windows):
server.actEvent.clear()
var acceptFut: Future[AsyncFD]
if server.action == ServerCommand.Start:
server.status = Running
var eventFut = server.actEvent.wait()
while true:
if server.status in {Paused}:
@ -485,7 +489,6 @@ when defined(windows):
elif server.action == ServerCommand.Pause:
if server.status in {Running}:
server.status = Paused
if acceptFut.finished:
if not acceptFut.failed:
var sock = acceptFut.read()
@ -494,6 +497,7 @@ when defined(windows):
newStreamSocketTransport(sock, server.bufferSize),
server.udata)
proc resumeRead(transp: StreamTransport) {.inline.} =
var wtransp = cast[WindowsStreamTransport](transp)
wtransp.state.excl(ReadPaused)
@ -627,16 +631,17 @@ else:
proc continuation(udata: pointer) =
var data = cast[ptr CompletionData](udata)
var err = 0
if not data.fd.getSocketError(err):
sock.closeAsyncSocket()
let fd = data.fd
if not fd.getSocketError(err):
fd.closeAsyncSocket()
retFuture.fail(newException(OSError, osErrorMsg(osLastError())))
return
if err != 0:
sock.closeAsyncSocket()
fd.closeAsyncSocket()
retFuture.fail(newException(OSError, osErrorMsg(OSErrorCode(err))))
return
data.fd.removeWriter()
retFuture.complete(newStreamSocketTransport(data.fd, bufferSize))
fd.removeWriter()
retFuture.complete(newStreamSocketTransport(fd, bufferSize))
while true:
var res = posix.connect(SocketHandle(sock),
@ -722,6 +727,8 @@ proc stop*(server: SocketServer) =
proc pause*(server: SocketServer) =
## Pause ``server``.
when defined(windows):
discard cancelIo(Handle(server.sock))
server.action = Pause
server.actEvent.fire()