diff options
Diffstat (limited to 'vendor/tokio/src/task/yield_now.rs')
-rw-r--r-- | vendor/tokio/src/task/yield_now.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/vendor/tokio/src/task/yield_now.rs b/vendor/tokio/src/task/yield_now.rs new file mode 100644 index 000000000..251cb931b --- /dev/null +++ b/vendor/tokio/src/task/yield_now.rs @@ -0,0 +1,38 @@ +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +cfg_rt! { + /// Yields execution back to the Tokio runtime. + /// + /// A task yields by awaiting on `yield_now()`, and may resume when that + /// future completes (with no output.) The current task will be re-added as + /// a pending task at the _back_ of the pending queue. Any other pending + /// tasks will be scheduled. No other waking is required for the task to + /// continue. + /// + /// See also the usage example in the [task module](index.html#yield_now). + #[must_use = "yield_now does nothing unless polled/`await`-ed"] + pub async fn yield_now() { + /// Yield implementation + struct YieldNow { + yielded: bool, + } + + impl Future for YieldNow { + type Output = (); + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { + if self.yielded { + return Poll::Ready(()); + } + + self.yielded = true; + cx.waker().wake_by_ref(); + Poll::Pending + } + } + + YieldNow { yielded: false }.await + } +} |