awaitWithTimeout for Future[void]

This commit is contained in:
Zahary Karadjov 2021-02-04 16:45:50 +02:00
parent a339944bcf
commit e8c9691b35
No known key found for this signature in database
GPG Key ID: C8936F8A3073D609
1 changed files with 18 additions and 0 deletions

View File

@ -22,3 +22,21 @@ template awaitWithTimeout*[T](operation: Future[T],
timeout: Duration, timeout: Duration,
onTimeout: untyped): T = onTimeout: untyped): T =
awaitWithTimeout(operation, sleepAsync(timeout), onTimeout) awaitWithTimeout(operation, sleepAsync(timeout), onTimeout)
template awaitWithTimeout*(operation: Future[void],
deadline: Future[void],
onTimeout: untyped) =
let f = operation
await f or deadline
if not f.finished:
# If we don't wait for for the cancellation here, it's possible that
# the "next" operation will run concurrently to this one, messing up
# the order of operations (since await/async is not fair)
await cancelAndWait(f)
onTimeout
template awaitWithTimeout*(operation: Future[void],
timeout: Duration,
onTimeout: untyped) =
awaitWithTimeout(operation, sleepAsync(timeout), onTimeout)