Rollup merge of #97524 - ibraheemdev:thread-raw, r=ibraheemdev · qinheping/verify-rust-std@5480d57 (original) (raw)
`@@ -1503,6 +1503,54 @@ impl Thread {
`
1503
1503
`self.inner.name.as_str()
`
1504
1504
`}
`
1505
1505
``
``
1506
`` +
/// Consumes the Thread
, returning a raw pointer.
``
``
1507
`+
///
`
``
1508
`+
/// To avoid a memory leak the pointer must be converted
`
``
1509
`` +
/// back into a Thread
using [Thread::from_raw
].
``
``
1510
`+
///
`
``
1511
`+
/// # Examples
`
``
1512
`+
///
`
``
1513
/// ```
``
1514
`+
/// #![feature(thread_raw)]
`
``
1515
`+
///
`
``
1516
`+
/// use std::thread::{self, Thread};
`
``
1517
`+
///
`
``
1518
`+
/// let thread = thread::current();
`
``
1519
`+
/// let id = thread.id();
`
``
1520
`+
/// let ptr = Thread::into_raw(thread);
`
``
1521
`+
/// unsafe {
`
``
1522
`+
/// assert_eq!(Thread::from_raw(ptr).id(), id);
`
``
1523
`+
/// }
`
``
1524
/// ```
``
1525
`+
#[unstable(feature = "thread_raw", issue = "97523")]
`
``
1526
`+
pub fn into_raw(self) -> *const () {
`
``
1527
`` +
// Safety: We only expose an opaque pointer, which maintains the Pin
invariant.
``
``
1528
`+
let inner = unsafe { Pin::into_inner_unchecked(self.inner) };
`
``
1529
`+
Arc::into_raw(inner) as *const ()
`
``
1530
`+
}
`
``
1531
+
``
1532
`` +
/// Constructs a Thread
from a raw pointer.
``
``
1533
`+
///
`
``
1534
`+
/// The raw pointer must have been previously returned
`
``
1535
`` +
/// by a call to [Thread::into_raw
].
``
``
1536
`+
///
`
``
1537
`+
/// # Safety
`
``
1538
`+
///
`
``
1539
`+
/// This function is unsafe because improper use may lead
`
``
1540
`` +
/// to memory unsafety, even if the returned Thread
is never
``
``
1541
`+
/// accessed.
`
``
1542
`+
///
`
``
1543
`` +
/// Creating a Thread
from a pointer other than one returned
``
``
1544
`` +
/// from [Thread::into_raw
] is undefined behavior.
``
``
1545
`+
///
`
``
1546
`+
/// Calling this function twice on the same raw pointer can lead
`
``
1547
`` +
/// to a double-free if both Thread
instances are dropped.
``
``
1548
`+
#[unstable(feature = "thread_raw", issue = "97523")]
`
``
1549
`+
pub unsafe fn from_raw(ptr: *const ()) -> Thread {
`
``
1550
`+
// Safety: Upheld by caller.
`
``
1551
`+
unsafe { Thread { inner: Pin::new_unchecked(Arc::from_raw(ptr as *const Inner)) } }
`
``
1552
`+
}
`
``
1553
+
1506
1554
`fn cname(&self) -> Option<&CStr> {
`
1507
1555
`self.inner.name.as_cstr()
`
1508
1556
`}
`