Add pending operations presence check function, fixes #5155
This commit is contained in:
parent
46e4b4854e
commit
8e71949b78
3 changed files with 46 additions and 2 deletions
|
|
@ -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)):
|
||||||
|
|
|
||||||
|
|
@ -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]]
|
||||||
|
|
||||||
|
|
|
||||||
21
tests/async/tpendingcheck.nim
Normal file
21
tests/async/tpendingcheck.nim
Normal 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())
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue