mirror of
https://github.com/logos-storage/nim-chronos.git
synced 2026-01-10 01:13:07 +00:00
Fix loop behavior.
This commit is contained in:
parent
608924d9f4
commit
4f70cb3515
@ -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"
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user