about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Thomas <david2005thomas@gmail.com>2024-04-04 23:17:15 +0100
committerDavid Thomas <david2005thomas@gmail.com>2024-04-04 23:17:15 +0100
commit0989416d2140ffc985dfe9644503e15322e2e412 (patch)
tree517e0d1c72e1e3d4b6a6eda6891d2cf1aecf5807
parent703dc9ce64d9b31a239a7280d9b5f9ddd85ffed6 (diff)
downloadrust-0989416d2140ffc985dfe9644503e15322e2e412.tar.gz
rust-0989416d2140ffc985dfe9644503e15322e2e412.zip
Remove rt::init allocation for thread name
-rw-r--r--library/std/src/rt.rs4
-rw-r--r--library/std/src/thread/mod.rs29
2 files changed, 27 insertions, 6 deletions
diff --git a/library/std/src/rt.rs b/library/std/src/rt.rs
index ff6e433ebce..59e118f81ab 100644
--- a/library/std/src/rt.rs
+++ b/library/std/src/rt.rs
@@ -16,8 +16,6 @@
 #![deny(unsafe_op_in_unsafe_fn)]
 #![allow(unused_macros)]
 
-use crate::ffi::CString;
-
 // Re-export some of our utilities which are expected by other crates.
 pub use crate::panicking::{begin_panic, panic_count};
 pub use core::panicking::{panic_display, panic_fmt};
@@ -96,7 +94,7 @@ unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
         sys::init(argc, argv, sigpipe);
 
         // Set up the current thread to give it the right name.
-        let thread = Thread::new(Some(rtunwrap!(Ok, CString::new("main"))));
+        let thread = Thread::new_main();
         thread::set_current(thread);
     }
 }
diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index f7eb92bc61e..25219d352aa 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -1247,9 +1247,16 @@ impl ThreadId {
 // Thread
 ////////////////////////////////////////////////////////////////////////////////
 
+/// The internal representation of a `Thread`'s name.
+enum ThreadName {
+    Main,
+    Other(CString),
+    Unnamed,
+}
+
 /// The internal representation of a `Thread` handle
 struct Inner {
-    name: Option<CString>, // Guaranteed to be UTF-8
+    name: ThreadName, // Guaranteed to be UTF-8
     id: ThreadId,
     parker: Parker,
 }
@@ -1286,8 +1293,20 @@ pub struct Thread {
 
 impl Thread {
     // Used only internally to construct a thread object without spawning
-    // Panics if the name contains nuls.
     pub(crate) fn new(name: Option<CString>) -> Thread {
+        if let Some(name) = name {
+            Self::new_inner(ThreadName::Other(name))
+        } else {
+            Self::new_inner(ThreadName::Unnamed)
+        }
+    }
+
+    // Used in runtime to construct main thread
+    pub(crate) fn new_main() -> Thread {
+        Self::new_inner(ThreadName::Main)
+    }
+
+    fn new_inner(name: ThreadName) -> Thread {
         // We have to use `unsafe` here to construct the `Parker` in-place,
         // which is required for the UNIX implementation.
         //
@@ -1414,7 +1433,11 @@ impl Thread {
     }
 
     fn cname(&self) -> Option<&CStr> {
-        self.inner.name.as_deref()
+        match &self.inner.name {
+            ThreadName::Main => Some(c"main"),
+            ThreadName::Other(other) => Some(&other),
+            ThreadName::Unnamed => None,
+        }
     }
 }