diff options
author | Eduardo Bart <edub4rt@gmail.com> | 2016-06-19 12:56:37 -0300 |
---|---|---|
committer | Eduardo Bart <edub4rt@gmail.com> | 2016-06-19 12:56:37 -0300 |
commit | c93292e2f7a8d3bf7c6fbadccafe1516d77b4ece (patch) | |
tree | 75a6798f4679f80fd2e3ab828a5ed4cc95f81fff /lib/pure | |
parent | 8182414a6f99c46dc31ba63e00fe1315981d2b50 (diff) | |
download | Nim-c93292e2f7a8d3bf7c6fbadccafe1516d77b4ece.tar.gz |
Add withTimeout proc for futures
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/asyncdispatch.nim | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index bb19f87ef..082fe40ff 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -1542,6 +1542,24 @@ proc sleepAsync*(ms: int): Future[void] = p.timers.push((epochTime() + (ms / 1000), retFuture)) return retFuture +proc withTimeout*[T](fut: Future[T], timeout: int): Future[bool] = + ## Returns a future which will complete once ``fut`` completes or after + ## ``timeout`` milliseconds has elapsed. + ## + ## If ``fut`` completes first the returned future will hold true, + ## otherwise, if ``timeout`` milliseconds has elapsed first, the returned + ## future will hold false. + + var retFuture = newFuture[bool]("asyncdispatch.`withTimeout`") + var timeoutFuture = sleepAsync(timeout) + fut.callback = + proc () = + if not retFuture.finished: retFuture.complete(true) + timeoutFuture.callback = + proc () = + if not retFuture.finished: retFuture.complete(false) + return retFuture + proc accept*(socket: AsyncFD, flags = {SocketFlag.SafeDisconn}): Future[AsyncFD] = ## Accepts a new connection. Returns a future containing the client socket |