diff options
Diffstat (limited to 'tokio/src/executor/tests/backoff.rs')
-rw-r--r-- | tokio/src/executor/tests/backoff.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tokio/src/executor/tests/backoff.rs b/tokio/src/executor/tests/backoff.rs new file mode 100644 index 00000000..358ab2da --- /dev/null +++ b/tokio/src/executor/tests/backoff.rs @@ -0,0 +1,32 @@ +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +pub(crate) struct Backoff(usize, bool); + +pub(crate) fn backoff(n: usize) -> impl Future<Output = ()> { + Backoff(n, false) +} + +/// Back off, but clone the waker each time +pub(crate) fn backoff_clone(n: usize) -> impl Future<Output = ()> { + Backoff(n, true) +} + +impl Future for Backoff { + type Output = (); + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { + if self.0 == 0 { + return Poll::Ready(()); + } + + self.0 -= 1; + if self.1 { + cx.waker().clone().wake(); + } else { + cx.waker().wake_by_ref(); + } + Poll::Pending + } +} |