Skip to content

Commit 98a6ad7

Browse files
committed
Auto merge of #97191 - wesleywiser:main_thread_name, r=ChrisDenton
Call the OS function to set the main thread's name on program init Normally, `Thread::spawn` takes care of setting the thread's name, if one was provided, but since the main thread wasn't created by calling `Thread::spawn`, we need to call that function in `std::rt::init`. This is mainly useful for system tools like debuggers and profilers which might show the thread name to a user. Prior to these changes, gdb and WinDbg would show all thread names except the main thread's name to a user. I've validated that this patch resolves the issue for both debuggers.
2 parents ce14e28 + de38ac5 commit 98a6ad7

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

std/src/sys/unix/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![allow(missing_docs, nonstandard_style)]
22

3+
use crate::ffi::CStr;
34
use crate::io::ErrorKind;
45

56
pub use self::rand::hashmap_random_keys;
@@ -66,6 +67,15 @@ pub unsafe fn init(argc: isize, argv: *const *const u8) {
6667
stack_overflow::init();
6768
args::init(argc, argv);
6869

70+
// Normally, `thread::spawn` will call `Thread::set_name` but since this thread
71+
// already exists, we have to call it ourselves. We only do this on macos
72+
// because some unix-like operating systems such as Linux share process-id and
73+
// thread-id for the main thread and so renaming the main thread will rename the
74+
// process and we only want to enable this on platforms we've tested.
75+
if cfg!(target_os = "macos") {
76+
thread::Thread::set_name(&CStr::from_bytes_with_nul_unchecked(b"main\0"));
77+
}
78+
6979
unsafe fn sanitize_standard_fds() {
7080
#[cfg(not(miri))]
7181
// The standard fds are always available in Miri.

std/src/sys/windows/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(missing_docs, nonstandard_style)]
22

3-
use crate::ffi::{OsStr, OsString};
3+
use crate::ffi::{CStr, OsStr, OsString};
44
use crate::io::ErrorKind;
55
use crate::os::windows::ffi::{OsStrExt, OsStringExt};
66
use crate::path::PathBuf;
@@ -49,6 +49,10 @@ cfg_if::cfg_if! {
4949
// NOTE: this is not guaranteed to run, for example when Rust code is called externally.
5050
pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
5151
stack_overflow::init();
52+
53+
// Normally, `thread::spawn` will call `Thread::set_name` but since this thread already
54+
// exists, we have to call it ourselves.
55+
thread::Thread::set_name(&CStr::from_bytes_with_nul_unchecked(b"main\0"));
5256
}
5357

5458
// SAFETY: must be called only once during runtime cleanup.

0 commit comments

Comments
 (0)