use std::future::Future;
use std::pin::Pin;
use std::task::Poll;
#[cfg(feature = "plugin-sidecar")]
use std::time::Duration;
const SETTLE: usize = 64;
pub(crate) async fn parked<F: Future + ?Sized>(mut future: Pin<&mut F>) {
for _ in 0..SETTLE {
assert!(poll_once(future.as_mut()).await, "the future stays parked");
tokio::task::yield_now().await;
}
}
#[cfg(feature = "plugin-sidecar")]
pub(crate) async fn outlasts<F: Future + ?Sized>(mut future: Pin<&mut F>, span: Duration) {
parked(future.as_mut()).await;
tokio::time::advance(span).await;
parked(future).await;
}
async fn poll_once<F: Future + ?Sized>(mut future: Pin<&mut F>) -> bool {
std::future::poll_fn(|context| Poll::Ready(future.as_mut().poll(context).is_pending())).await
}