mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Auto merge of #107060 - ibraheemdev:poll-ready, r=joshtriplett
Remove unstable `Poll::ready` Based on the discussion in https://github.com/rust-lang/rust/issues/89780, this API is problematic and would likely require changes over an edition. Now that `task::ready!` is stabilized, this seems unlikely to happen, so I think we should just go ahead and remove it. ACP: https://github.com/rust-lang/libs-team/issues/214
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
use crate::future::{poll_fn, Future};
|
||||
use crate::mem;
|
||||
use crate::pin::Pin;
|
||||
use crate::task::{Context, Poll};
|
||||
use crate::task::{ready, Context, Poll};
|
||||
|
||||
/// Polls multiple futures simultaneously, returning a tuple
|
||||
/// of all results once complete.
|
||||
@@ -118,7 +118,7 @@
|
||||
fut
|
||||
})
|
||||
};
|
||||
// Despite how tempting it may be to `let () = fut.poll(cx).ready()?;`
|
||||
// Despite how tempting it may be to `let () = ready!(fut.poll(cx));`
|
||||
// doing so would defeat the point of `join!`: to start polling eagerly all
|
||||
// of the futures, to allow parallelizing the waits.
|
||||
done &= fut.poll(cx).is_ready();
|
||||
@@ -180,7 +180,7 @@ fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
// Do not mix match ergonomics with unsafe.
|
||||
match *self.as_mut().get_unchecked_mut() {
|
||||
MaybeDone::Future(ref mut f) => {
|
||||
let val = Pin::new_unchecked(f).poll(cx).ready()?;
|
||||
let val = ready!(Pin::new_unchecked(f).poll(cx));
|
||||
self.set(Self::Done(val));
|
||||
}
|
||||
MaybeDone::Done(_) => {}
|
||||
|
||||
@@ -13,5 +13,3 @@
|
||||
mod ready;
|
||||
#[stable(feature = "ready_macro", since = "1.64.0")]
|
||||
pub use ready::ready;
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
pub use ready::Ready;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
use crate::convert;
|
||||
use crate::ops::{self, ControlFlow};
|
||||
use crate::result::Result;
|
||||
use crate::task::Ready;
|
||||
|
||||
/// Indicates whether a value is available or if the current task has been
|
||||
/// scheduled to receive a wakeup instead.
|
||||
@@ -95,38 +94,6 @@ pub const fn is_ready(&self) -> bool {
|
||||
pub const fn is_pending(&self) -> bool {
|
||||
!self.is_ready()
|
||||
}
|
||||
|
||||
/// Extracts the successful type of a [`Poll<T>`].
|
||||
///
|
||||
/// When combined with the `?` operator, this function will
|
||||
/// propagate any [`Poll::Pending`] values to the caller, and
|
||||
/// extract the `T` from [`Poll::Ready`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// #![feature(poll_ready)]
|
||||
///
|
||||
/// use std::task::{Context, Poll};
|
||||
/// use std::future::{self, Future};
|
||||
/// use std::pin::Pin;
|
||||
///
|
||||
/// pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> {
|
||||
/// let mut fut = future::ready(42);
|
||||
/// let fut = Pin::new(&mut fut);
|
||||
///
|
||||
/// let num = fut.poll(cx).ready()?;
|
||||
/// # let _ = num; // to silence unused warning
|
||||
/// // ... use num
|
||||
///
|
||||
/// Poll::Ready(())
|
||||
/// }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
pub fn ready(self) -> Ready<T> {
|
||||
Ready(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, E> Poll<Result<T, E>> {
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
use core::convert;
|
||||
use core::fmt;
|
||||
use core::ops::{ControlFlow, FromResidual, Try};
|
||||
use core::task::Poll;
|
||||
|
||||
/// Extracts the successful type of a [`Poll<T>`].
|
||||
///
|
||||
/// This macro bakes in propagation of [`Pending`] signals by returning early.
|
||||
@@ -60,55 +55,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Extracts the successful type of a [`Poll<T>`].
|
||||
///
|
||||
/// See [`Poll::ready`] for details.
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
pub struct Ready<T>(pub(crate) Poll<T>);
|
||||
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
impl<T> Try for Ready<T> {
|
||||
type Output = T;
|
||||
type Residual = Ready<convert::Infallible>;
|
||||
|
||||
#[inline]
|
||||
fn from_output(output: Self::Output) -> Self {
|
||||
Ready(Poll::Ready(output))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
|
||||
match self.0 {
|
||||
Poll::Ready(v) => ControlFlow::Continue(v),
|
||||
Poll::Pending => ControlFlow::Break(Ready(Poll::Pending)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
impl<T> FromResidual for Ready<T> {
|
||||
#[inline]
|
||||
fn from_residual(residual: Ready<convert::Infallible>) -> Self {
|
||||
match residual.0 {
|
||||
Poll::Pending => Ready(Poll::Pending),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
impl<T> FromResidual<Ready<convert::Infallible>> for Poll<T> {
|
||||
#[inline]
|
||||
fn from_residual(residual: Ready<convert::Infallible>) -> Self {
|
||||
match residual.0 {
|
||||
Poll::Pending => Poll::Pending,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "poll_ready", issue = "89780")]
|
||||
impl<T> fmt::Debug for Ready<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_tuple("Ready").finish()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user