Skip to content

Commit

Permalink
Add tracking issue to async_drop API
Browse files Browse the repository at this point in the history
  • Loading branch information
zetanumbers committed Jun 17, 2024
1 parent 8cd20cb commit 2238945
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 13 deletions.
24 changes: 12 additions & 12 deletions core/src/future/async_drop.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![unstable(feature = "async_drop", issue = "none")]
#![unstable(feature = "async_drop", issue = "126482")]

use crate::fmt;
use crate::future::{Future, IntoFuture};
Expand All @@ -10,27 +10,27 @@ use crate::task::{ready, Context, Poll};

/// Asynchronously drops a value by running `AsyncDrop::async_drop`
/// on a value and its fields recursively.
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
pub fn async_drop<T>(value: T) -> AsyncDropOwning<T> {
AsyncDropOwning { value: MaybeUninit::new(value), dtor: None, _pinned: PhantomPinned }
}

/// A future returned by the [`async_drop`].
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
pub struct AsyncDropOwning<T> {
value: MaybeUninit<T>,
dtor: Option<AsyncDropInPlace<T>>,
_pinned: PhantomPinned,
}

#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
impl<T> fmt::Debug for AsyncDropOwning<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("AsyncDropOwning").finish_non_exhaustive()
}
}

#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
impl<T> Future for AsyncDropOwning<T> {
type Output = ();

Expand Down Expand Up @@ -86,24 +86,24 @@ unsafe fn async_drop_in_place_raw<T: ?Sized>(
/// returned future stores the `to_drop` pointer and user is required
/// to guarantee that dropped value doesn't move.
///
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
pub unsafe fn async_drop_in_place<T: ?Sized>(to_drop: *mut T) -> AsyncDropInPlace<T> {
// SAFETY: `async_drop_in_place_raw` has the same safety requirements
unsafe { AsyncDropInPlace(async_drop_in_place_raw(to_drop)) }
}

/// A future returned by the [`async_drop_in_place`].
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
pub struct AsyncDropInPlace<T: ?Sized>(<T as AsyncDestruct>::AsyncDestructor);

#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
impl<T: ?Sized> fmt::Debug for AsyncDropInPlace<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("AsyncDropInPlace").finish_non_exhaustive()
}
}

#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
impl<T: ?Sized> Future for AsyncDropInPlace<T> {
type Output = ();

Expand All @@ -117,18 +117,18 @@ impl<T: ?Sized> Future for AsyncDropInPlace<T> {
// FIXME(zetanumbers): Add same restrictions on AsyncDrop impls as
// with Drop impls
/// Custom code within the asynchronous destructor.
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
#[lang = "async_drop"]
pub trait AsyncDrop {
/// A future returned by the [`AsyncDrop::async_drop`] to be part
/// of the async destructor.
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
type Dropper<'a>: Future<Output = ()>
where
Self: 'a;

/// Constructs the asynchronous destructor for this type.
#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
fn async_drop(self: Pin<&mut Self>) -> Self::Dropper<'_>;
}

Expand Down
2 changes: 1 addition & 1 deletion core/src/future/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub use ready::{ready, Ready};
#[stable(feature = "future_poll_fn", since = "1.64.0")]
pub use poll_fn::{poll_fn, PollFn};

#[unstable(feature = "async_drop", issue = "none")]
#[unstable(feature = "async_drop", issue = "126482")]
pub use async_drop::{async_drop, async_drop_in_place, AsyncDrop, AsyncDropInPlace};

/// This type is needed because:
Expand Down

0 comments on commit 2238945

Please sign in to comment.