Skip to content

Commit 82d6d20

Browse files
committed
use MaybeDangling in std
1 parent c02b738 commit 82d6d20

File tree

2 files changed

+3
-23
lines changed

2 files changed

+3
-23
lines changed

library/std/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@
345345
#![feature(int_from_ascii)]
346346
#![feature(ip)]
347347
#![feature(lazy_get)]
348+
#![feature(maybe_dangling)]
348349
#![feature(maybe_uninit_array_assume_init)]
349350
#![feature(panic_can_unwind)]
350351
#![feature(panic_internals)]

library/std/src/thread/lifecycle.rs

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use super::thread::Thread;
77
use super::{Result, spawnhook};
88
use crate::cell::UnsafeCell;
99
use crate::marker::PhantomData;
10-
use crate::mem::{ManuallyDrop, MaybeUninit};
10+
use crate::mem::MaybeDangling;
1111
use crate::sync::Arc;
1212
use crate::sync::atomic::{Atomic, AtomicUsize, Ordering};
1313
use crate::sys::thread as imp;
@@ -58,29 +58,8 @@ where
5858
Arc::new(Packet { scope: scope_data, result: UnsafeCell::new(None), _marker: PhantomData });
5959
let their_packet = my_packet.clone();
6060

61-
// Pass `f` in `MaybeUninit` because actually that closure might *run longer than the lifetime of `F`*.
61+
// Pass `f` in `MaybeDangling` because actually that closure might *run longer than the lifetime of `F`*.
6262
// See <https://github.com/rust-lang/rust/issues/101983> for more details.
63-
// To prevent leaks we use a wrapper that drops its contents.
64-
#[repr(transparent)]
65-
struct MaybeDangling<T>(MaybeUninit<T>);
66-
impl<T> MaybeDangling<T> {
67-
fn new(x: T) -> Self {
68-
MaybeDangling(MaybeUninit::new(x))
69-
}
70-
fn into_inner(self) -> T {
71-
// Make sure we don't drop.
72-
let this = ManuallyDrop::new(self);
73-
// SAFETY: we are always initialized.
74-
unsafe { this.0.assume_init_read() }
75-
}
76-
}
77-
impl<T> Drop for MaybeDangling<T> {
78-
fn drop(&mut self) {
79-
// SAFETY: we are always initialized.
80-
unsafe { self.0.assume_init_drop() };
81-
}
82-
}
83-
8463
let f = MaybeDangling::new(f);
8564

8665
// The entrypoint of the Rust thread, after platform-specific thread

0 commit comments

Comments
 (0)