diff options
author | PMunch <peterme@peterme.net> | 2019-09-22 07:24:14 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-09-22 07:24:14 +0200 |
commit | 2565d3d102efd21ba02ed1f3b96d892fe2637d2b (patch) | |
tree | 8bc0a392cba578e94f88f0fc2d41a5cc675b4948 /lib/pure/asyncdispatch.nim | |
parent | 39185b46ca285ee9ca40d09331cea73056f524ca (diff) | |
download | Nim-2565d3d102efd21ba02ed1f3b96d892fe2637d2b.tar.gz |
Fix issue with long wait for passed timer [bugfix] (#12221)
* Fix issue with long wait for passed timer [bugfix] This fixes a small issue where a timer that had been completed while code executed would still wait for more events before being considered completed. This would in some scenarios incur a 500ms delay to the completion of a timer. * Refactor logic into * Add test case based on original issue * Use longer timeouts to be more lenient in checking * Revert to short timeouts, but widen the accepted range * Widen accepted range further, it is meant to check for a 500ms delay after all * Increase poll timeout to make it easier to detect mistakes
Diffstat (limited to 'lib/pure/asyncdispatch.nim')
-rw-r--r-- | lib/pure/asyncdispatch.nim | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 7c1b701b8..f4dc3de39 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -210,7 +210,12 @@ proc processPendingCallbacks(p: PDispatcherBase; didSomeWork: var bool) = cb() didSomeWork = true -proc adjustTimeout(pollTimeout: int, nextTimer: Option[int]): int {.inline.} = +proc adjustTimeout( + p: PDispatcherBase, pollTimeout: int, nextTimer: Option[int] +): int {.inline.} = + if p.callbacks.len != 0: + return 0 + if nextTimer.isNone() or pollTimeout == -1: return pollTimeout @@ -324,7 +329,7 @@ when defined(windows) or defined(nimdoc): result = false let nextTimer = processTimers(p, result) - let at = adjustTimeout(timeout, nextTimer) + let at = adjustTimeout(p, timeout, nextTimer) var llTimeout = if at == -1: winlean.INFINITE else: at.int32 @@ -1284,7 +1289,8 @@ else: result = false var keys: array[64, ReadyKey] let nextTimer = processTimers(p, result) - var count = p.selector.selectInto(adjustTimeout(timeout, nextTimer), keys) + var count = + p.selector.selectInto(adjustTimeout(p, timeout, nextTimer), keys) for i in 0..<count: let fd = keys[i].fd.AsyncFD let events = keys[i].events |