diff --git a/eth/async_utils.nim b/eth/async_utils.nim index 3f418af..8d5c248 100644 --- a/eth/async_utils.nim +++ b/eth/async_utils.nim @@ -22,3 +22,21 @@ template awaitWithTimeout*[T](operation: Future[T], timeout: Duration, onTimeout: untyped): T = 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) +