Add pending operations presence check function, fixes #5155

This commit is contained in:
Anatoly Galiulin 2016-12-29 11:22:50 +07:00
commit 8e71949b78
3 changed files with 46 additions and 2 deletions

View file

@ -254,8 +254,14 @@ when defined(windows) or defined(nimdoc):
"Operation performed on a socket which has not been registered with" & "Operation performed on a socket which has not been registered with" &
" the dispatcher yet.") " the dispatcher yet.")
proc hasPendingOperations*(): bool =
## Returns `true` if the global dispatcher has pending operations.
let p = getGlobalDispatcher()
p.handles.len != 0 or p.timers.len != 0 or p.callbacks.len != 0
proc poll*(timeout = 500) = proc poll*(timeout = 500) =
## Waits for completion events and processes them. ## Waits for completion events and processes them. Raises ``ValueError``
## if there are no pending operations.
let p = getGlobalDispatcher() let p = getGlobalDispatcher()
if p.handles.len == 0 and p.timers.len == 0 and p.callbacks.len == 0: if p.handles.len == 0 and p.timers.len == 0 and p.callbacks.len == 0:
raise newException(ValueError, raise newException(ValueError,
@ -1056,8 +1062,15 @@ else:
newCBs.add(cb) newCBs.add(cb)
callbacks = newCBs & callbacks callbacks = newCBs & callbacks
proc hasPendingOperations*(): bool =
let p = getGlobalDispatcher()
p.selector.len != 0 or p.timers.len != 0 or p.callbacks.len != 0
proc poll*(timeout = 500) = proc poll*(timeout = 500) =
let p = getGlobalDispatcher() let p = getGlobalDispatcher()
if p.selector.len == 0 and p.timers.len == 0 and p.callbacks.len == 0:
raise newException(ValueError,
"No handles or timers registered in dispatcher.")
if p.selector.len > 0: if p.selector.len > 0:
for info in p.selector.select(p.adjustedTimeout(timeout)): for info in p.selector.select(p.adjustedTimeout(timeout)):

View file

@ -231,8 +231,14 @@ when defined(windows) or defined(nimdoc):
"Operation performed on a socket which has not been registered with" & "Operation performed on a socket which has not been registered with" &
" the dispatcher yet.") " the dispatcher yet.")
proc hasPendingOperations*(): bool =
## Returns `true` if the global dispatcher has pending operations.
let p = getGlobalDispatcher()
p.handles.len != 0 or p.timers.len != 0 or p.callbacks.len != 0
proc poll*(timeout = 500) = proc poll*(timeout = 500) =
## Waits for completion events and processes them. ## Waits for completion events and processes them. Raises ``ValueError``
## if there are no pending operations.
let p = getGlobalDispatcher() let p = getGlobalDispatcher()
if p.handles.len == 0 and p.timers.len == 0 and p.callbacks.len == 0: if p.handles.len == 0 and p.timers.len == 0 and p.callbacks.len == 0:
raise newException(ValueError, raise newException(ValueError,
@ -1182,6 +1188,10 @@ else:
raise newException(ValueError, "File descriptor not registered.") raise newException(ValueError, "File descriptor not registered.")
p.selector.updateHandle(fd.SocketHandle, newEvents) p.selector.updateHandle(fd.SocketHandle, newEvents)
proc hasPendingOperations*(): bool =
let p = getGlobalDispatcher()
not p.selector.isEmpty() or p.timers.len != 0 or p.callbacks.len != 0
proc poll*(timeout = 500) = proc poll*(timeout = 500) =
var keys: array[64, ReadyKey[AsyncData]] var keys: array[64, ReadyKey[AsyncData]]

View file

@ -0,0 +1,21 @@
discard """
file: "tpendingcheck.nim"
exitcode: 0
output: ""
"""
import asyncdispatch
doAssert(not hasPendingOperations())
proc test() {.async.} =
await sleepAsync(100)
var f = test()
while not f.finished:
doAssert(hasPendingOperations())
poll(10)
f.read
doAssert(not hasPendingOperations())