Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c8b699c

Browse files
committedMay 29, 2024
Optimize async drop glue for some old types
1 parent 1aaf0a9 commit c8b699c

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed
 

‎core/src/future/async_drop.rs

+11
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ async unsafe fn surface_drop_in_place<T: Drop + ?Sized>(ptr: *mut T) {
161161
/// wrapped future completes by returning `Poll::Ready(())` on poll. This
162162
/// is useful for constructing async destructors to guarantee this
163163
/// "fuse" property
164+
//
165+
// FIXME: Consider optimizing combinators to not have to use fuse in majority
166+
// of cases, perhaps by adding `#[(rustc_)idempotent(_future)]` attribute for
167+
// async functions and blocks with the unit return type. However current layout
168+
// optimizations currently encode `None` case into the async block's discriminant.
164169
struct Fuse<T> {
165170
inner: Option<T>,
166171
}
@@ -251,6 +256,12 @@ async unsafe fn either<O: IntoFuture<Output = ()>, M: IntoFuture<Output = ()>, T
251256
}
252257
}
253258

259+
#[cfg(not(bootstrap))]
260+
#[lang = "async_drop_deferred_drop_in_place"]
261+
async unsafe fn deferred_drop_in_place<T>(to_drop: *mut T) {
262+
unsafe { crate::ptr::drop_in_place(to_drop) }
263+
}
264+
254265
/// Used for noop async destructors. We don't use [`core::future::Ready`]
255266
/// because it panics after its second poll, which could be potentially
256267
/// bad if that would happen during the cleanup.

0 commit comments

Comments
 (0)
Failed to load comments.