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 01b68b7

Browse files
committedJul 21, 2022·
add Thread::{into_raw, from_raw}
1 parent 8a33254 commit 01b68b7

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed
 

‎library/std/src/thread/mod.rs

+46
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,52 @@ impl Thread {
12301230
self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) })
12311231
}
12321232

1233+
/// Consumes the `Thread`, returning a raw pointer.
1234+
///
1235+
/// To avoid a memory leak the pointer must be converted
1236+
/// back into a `Thread` using [`Thread::from_raw`].
1237+
///
1238+
/// # Examples
1239+
///
1240+
/// ```
1241+
/// #![feature(thread_raw)]
1242+
///
1243+
/// use std::thread::{self, Thread};
1244+
///
1245+
/// let thread = thread::current();
1246+
/// let id = thread.id();
1247+
/// let ptr = Thread::into_raw(thread);
1248+
/// unsafe {
1249+
/// assert_eq!(Thread::from_raw(ptr).id(), id);
1250+
/// }
1251+
/// ```
1252+
#[unstable(feature = "thread_raw", issue = "97523")]
1253+
pub fn into_raw(self) -> *const () {
1254+
Arc::into_raw(Pin::into_inner(self.inner)) as *const ()
1255+
}
1256+
1257+
/// Constructs a `Thread` from a raw pointer.
1258+
///
1259+
/// The raw pointer must have been previously returned
1260+
/// by a call to [`Thread::into_raw`].
1261+
///
1262+
/// # Safety
1263+
///
1264+
/// This function is unsafe because improper use may lead
1265+
/// to memory unsafety, even if the returned `Thread` is never
1266+
/// accessed.
1267+
///
1268+
/// Creating a `Thread` from a pointer other than one returned
1269+
/// from [`Thread::into_raw`] is **undefined behavior**.
1270+
///
1271+
/// Calling this function twice on the same raw pointer can lead
1272+
/// to a double-free if both `Thread` instances are dropped.
1273+
#[unstable(feature = "thread_raw", issue = "97523")]
1274+
pub unsafe fn from_raw(ptr: *const ()) -> Thread {
1275+
// SAFETY: upheld by caller
1276+
unsafe { Thread { inner: Pin::new_unchecked(Arc::from_raw(ptr as *const Inner)) } }
1277+
}
1278+
12331279
fn cname(&self) -> Option<&CStr> {
12341280
self.inner.name.as_deref()
12351281
}

0 commit comments

Comments
 (0)
Please sign in to comment.