Ensure that `OwnCancelSchedule` flag will not be removed from `wait()` and `withTimeout()`. (#519)
This commit is contained in:
parent
1eb834a2f9
commit
4ed0cd6be7
|
@ -1410,6 +1410,8 @@ proc withTimeout*[T](fut: Future[T], timeout: Duration): Future[bool] {.
|
|||
var
|
||||
retFuture = newFuture[bool]("chronos.withTimeout",
|
||||
{FutureFlag.OwnCancelSchedule})
|
||||
# We set `OwnCancelSchedule` flag, because we going to cancel `retFuture`
|
||||
# manually at proper time.
|
||||
moment: Moment
|
||||
timer: TimerCallback
|
||||
timeouted = false
|
||||
|
@ -1536,6 +1538,8 @@ proc wait*[T](fut: Future[T], timeout = InfiniteDuration): Future[T] =
|
|||
## should return, because it can't be cancelled too.
|
||||
var
|
||||
retFuture = newFuture[T]("chronos.wait()", {FutureFlag.OwnCancelSchedule})
|
||||
# We set `OwnCancelSchedule` flag, because we going to cancel `retFuture`
|
||||
# manually at proper time.
|
||||
|
||||
waitImpl(fut, retFuture, timeout)
|
||||
|
||||
|
@ -1677,6 +1681,8 @@ proc wait*(fut: InternalRaisesFuture, timeout = InfiniteDuration): auto =
|
|||
InternalRaisesFutureRaises = E.prepend(CancelledError, AsyncTimeoutError)
|
||||
|
||||
let
|
||||
retFuture = newFuture[T]("chronos.wait()", {FutureFlag.OwnCancelSchedule})
|
||||
retFuture = newFuture[T]("chronos.wait()", {OwnCancelSchedule})
|
||||
# We set `OwnCancelSchedule` flag, because we going to cancel `retFuture`
|
||||
# manually at proper time.
|
||||
|
||||
waitImpl(fut, retFuture, timeout)
|
||||
|
|
|
@ -1594,6 +1594,19 @@ suite "Future[T] behavior test suite":
|
|||
discard someFut.tryCancel()
|
||||
await someFut
|
||||
|
||||
asyncTest "wait() should allow cancellation test (depends on race())":
|
||||
proc testFoo(): Future[bool] {.async.} =
|
||||
let
|
||||
resFut = sleepAsync(2.seconds).wait(3.seconds)
|
||||
timeFut = sleepAsync(1.seconds)
|
||||
cancelFut = cancelAndWait(resFut)
|
||||
discard await race(cancelFut, timeFut)
|
||||
if cancelFut.finished():
|
||||
return (resFut.cancelled() and cancelFut.completed())
|
||||
false
|
||||
|
||||
check (await testFoo()) == true
|
||||
|
||||
asyncTest "withTimeout() cancellation undefined behavior test #1":
|
||||
proc testInnerFoo(fooFut: Future[void]): Future[TestFooConnection] {.
|
||||
async.} =
|
||||
|
@ -1654,6 +1667,19 @@ suite "Future[T] behavior test suite":
|
|||
discard someFut.tryCancel()
|
||||
await someFut
|
||||
|
||||
asyncTest "withTimeout() should allow cancellation test (depends on race())":
|
||||
proc testFoo(): Future[bool] {.async.} =
|
||||
let
|
||||
resFut = sleepAsync(2.seconds).withTimeout(3.seconds)
|
||||
timeFut = sleepAsync(1.seconds)
|
||||
cancelFut = cancelAndWait(resFut)
|
||||
discard await race(cancelFut, timeFut)
|
||||
if cancelFut.finished():
|
||||
return (resFut.cancelled() and cancelFut.completed())
|
||||
false
|
||||
|
||||
check (await testFoo()) == true
|
||||
|
||||
asyncTest "Cancellation behavior test":
|
||||
proc testInnerFoo(fooFut: Future[void]) {.async.} =
|
||||
await fooFut
|
||||
|
|
Loading…
Reference in New Issue