summaryrefslogtreecommitdiffstats
path: root/third_party/rust/futures-util/src/async_await/pending.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/futures-util/src/async_await/pending.rs')
-rw-r--r--third_party/rust/futures-util/src/async_await/pending.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/third_party/rust/futures-util/src/async_await/pending.rs b/third_party/rust/futures-util/src/async_await/pending.rs
new file mode 100644
index 0000000000..5d7a431811
--- /dev/null
+++ b/third_party/rust/futures-util/src/async_await/pending.rs
@@ -0,0 +1,43 @@
+use core::pin::Pin;
+use futures_core::future::Future;
+use futures_core::task::{Context, Poll};
+
+/// A macro which yields to the event loop once.
+///
+/// This is equivalent to returning [`Poll::Pending`](futures_core::task::Poll)
+/// from a [`Future::poll`](futures_core::future::Future::poll) implementation.
+/// Similarly, when using this macro, it must be ensured that [`wake`](std::task::Waker::wake)
+/// is called somewhere when further progress can be made.
+///
+/// This macro is only usable inside of async functions, closures, and blocks.
+/// It is also gated behind the `async-await` feature of this library, which is
+/// activated by default.
+#[macro_export]
+macro_rules! pending {
+ () => {
+ $crate::__private::async_await::pending_once().await
+ };
+}
+
+#[doc(hidden)]
+pub fn pending_once() -> PendingOnce {
+ PendingOnce { is_ready: false }
+}
+
+#[allow(missing_debug_implementations)]
+#[doc(hidden)]
+pub struct PendingOnce {
+ is_ready: bool,
+}
+
+impl Future for PendingOnce {
+ type Output = ();
+ fn poll(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
+ if self.is_ready {
+ Poll::Ready(())
+ } else {
+ self.is_ready = true;
+ Poll::Pending
+ }
+ }
+}