Rollup merge of #127918 - ChrisDenton:thread-name-string, r=joboet · patricklam/verify-rust-std@2b62867 (original) (raw)
`@@ -161,7 +161,7 @@ mod tests;
`
161
161
`use crate::any::Any;
`
162
162
`use crate::cell::{Cell, OnceCell, UnsafeCell};
`
163
163
`use crate::env;
`
164
``
`-
use crate::ffi::{CStr, CString};
`
``
164
`+
use crate::ffi::CStr;
`
165
165
`use crate::fmt;
`
166
166
`use crate::io;
`
167
167
`use crate:📑:PhantomData;
`
`@@ -487,11 +487,7 @@ impl Builder {
`
487
487
` amt
`
488
488
`});
`
489
489
``
490
``
`-
let my_thread = name.map_or_else(Thread::new_unnamed, |name| unsafe {
`
491
``
`-
Thread::new(
`
492
``
`-
CString::new(name).expect("thread name may not contain interior null bytes"),
`
493
``
`-
)
`
494
``
`-
});
`
``
490
`+
let my_thread = name.map_or_else(Thread::new_unnamed, Thread::new);
`
495
491
`let their_thread = my_thread.clone();
`
496
492
``
497
493
`let my_packet: Arc<Packet<'scope, T>> = Arc::new(Packet {
`
`@@ -1299,10 +1295,51 @@ impl ThreadId {
`
1299
1295
`` /// The internal representation of a Thread
's name.
``
1300
1296
`enum ThreadName {
`
1301
1297
`Main,
`
1302
``
`-
Other(CString),
`
``
1298
`+
Other(ThreadNameString),
`
1303
1299
`Unnamed,
`
1304
1300
`}
`
1305
1301
``
``
1302
`+
// This module ensures private fields are kept private, which is necessary to enforce the safety requirements.
`
``
1303
`+
mod thread_name_string {
`
``
1304
`+
use super::ThreadName;
`
``
1305
`+
use crate::ffi::{CStr, CString};
`
``
1306
`+
use core::str;
`
``
1307
+
``
1308
`` +
/// Like a String
it's guaranteed UTF-8 and like a CString
it's null terminated.
``
``
1309
`+
pub(crate) struct ThreadNameString {
`
``
1310
`+
inner: CString,
`
``
1311
`+
}
`
``
1312
`+
impl core::ops::Deref for ThreadNameString {
`
``
1313
`+
type Target = CStr;
`
``
1314
`+
fn deref(&self) -> &CStr {
`
``
1315
`+
&self.inner
`
``
1316
`+
}
`
``
1317
`+
}
`
``
1318
`+
impl From for ThreadNameString {
`
``
1319
`+
fn from(s: String) -> Self {
`
``
1320
`+
Self {
`
``
1321
`+
inner: CString::new(s).expect("thread name may not contain interior null bytes"),
`
``
1322
`+
}
`
``
1323
`+
}
`
``
1324
`+
}
`
``
1325
`+
impl ThreadName {
`
``
1326
`+
pub fn as_cstr(&self) -> Option<&CStr> {
`
``
1327
`+
match self {
`
``
1328
`+
ThreadName::Main => Some(c"main"),
`
``
1329
`+
ThreadName::Other(other) => Some(other),
`
``
1330
`+
ThreadName::Unnamed => None,
`
``
1331
`+
}
`
``
1332
`+
}
`
``
1333
+
``
1334
`+
pub fn as_str(&self) -> Option<&str> {
`
``
1335
`` +
// SAFETY: as_cstr
can only return Some
for a fixed CStr or a ThreadNameString
,
``
``
1336
`+
// which is guaranteed to be UTF-8.
`
``
1337
`+
self.as_cstr().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) })
`
``
1338
`+
}
`
``
1339
`+
}
`
``
1340
`+
}
`
``
1341
`+
pub(crate) use thread_name_string::ThreadNameString;
`
``
1342
+
1306
1343
`` /// The internal representation of a Thread
handle
``
1307
1344
`struct Inner {
`
1308
1345
`name: ThreadName, // Guaranteed to be UTF-8
`
`@@ -1342,25 +1379,20 @@ pub struct Thread {
`
1342
1379
``
1343
1380
`impl Thread {
`
1344
1381
`/// Used only internally to construct a thread object without spawning.
`
1345
``
`-
///
`
1346
``
`-
/// # Safety
`
1347
``
`` -
/// name
must be valid UTF-8.
``
1348
``
`-
pub(crate) unsafe fn new(name: CString) -> Thread {
`
1349
``
`-
unsafe { Self::new_inner(ThreadName::Other(name)) }
`
``
1382
`+
pub(crate) fn new(name: String) -> Thread {
`
``
1383
`+
Self::new_inner(ThreadName::Other(name.into()))
`
1350
1384
`}
`
1351
1385
``
1352
1386
`pub(crate) fn new_unnamed() -> Thread {
`
1353
``
`-
unsafe { Self::new_inner(ThreadName::Unnamed) }
`
``
1387
`+
Self::new_inner(ThreadName::Unnamed)
`
1354
1388
`}
`
1355
1389
``
1356
1390
`// Used in runtime to construct main thread
`
1357
1391
`pub(crate) fn new_main() -> Thread {
`
1358
``
`-
unsafe { Self::new_inner(ThreadName::Main) }
`
``
1392
`+
Self::new_inner(ThreadName::Main)
`
1359
1393
`}
`
1360
1394
``
1361
``
`-
/// # Safety
`
1362
``
`` -
/// If name
is ThreadName::Other(_)
, the contained string must be valid UTF-8.
``
1363
``
`-
unsafe fn new_inner(name: ThreadName) -> Thread {
`
``
1395
`+
fn new_inner(name: ThreadName) -> Thread {
`
1364
1396
`` // We have to use unsafe
here to construct the Parker
in-place,
``
1365
1397
`// which is required for the UNIX implementation.
`
1366
1398
`//
`
`@@ -1483,15 +1515,11 @@ impl Thread {
`
1483
1515
`#[stable(feature = "rust1", since = "1.0.0")]
`
1484
1516
`#[must_use]
`
1485
1517
`pub fn name(&self) -> Option<&str> {
`
1486
``
`-
self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) })
`
``
1518
`+
self.inner.name.as_str()
`
1487
1519
`}
`
1488
1520
``
1489
1521
`fn cname(&self) -> Option<&CStr> {
`
1490
``
`-
match &self.inner.name {
`
1491
``
`-
ThreadName::Main => Some(c"main"),
`
1492
``
`-
ThreadName::Other(other) => Some(&other),
`
1493
``
`-
ThreadName::Unnamed => None,
`
1494
``
`-
}
`
``
1522
`+
self.inner.name.as_cstr()
`
1495
1523
`}
`
1496
1524
`}
`
1497
1525
``