use pin_project_lite::pin_project; use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; pin_project! { /// Future for the [`unconstrained`](unconstrained) method. #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] #[must_use = "Unconstrained does nothing unless polled"] pub struct Unconstrained { #[pin] inner: F, } } impl Future for Unconstrained where F: Future, { type Output = ::Output; cfg_coop! { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let inner = self.project().inner; crate::coop::with_unconstrained(|| inner.poll(cx)) } } cfg_not_coop! { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let inner = self.project().inner; inner.poll(cx) } } } /// Turn off cooperative scheduling for a future. The future will never be forced to yield by /// Tokio. Using this exposes your service to starvation if the unconstrained future never yields /// otherwise. /// /// See also the usage example in the [task module](index.html#unconstrained). #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] pub fn unconstrained(inner: F) -> Unconstrained { Unconstrained { inner } }