Skip to content

Commit

Permalink
Rollup merge of #123505 - ChrisDenton:revert-121666, r=workingjubilee
Browse files Browse the repository at this point in the history
Revert "Use OS thread name by default"

This reverts #121666 (Use the OS thread name by default if `THREAD_INFO` has not been initialized) due to #123495 (Thread names are not always valid UTF-8).

It's not a direct revert because there have been other changes since that PR.
GuillaumeGomez authored Apr 5, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents 8a6f9a1 + 7d00826 commit 1bffe75
Showing 13 changed files with 10 additions and 164 deletions.
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/hermit/thread.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@

use super::abi;
use super::thread_local_dtor::run_dtors;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::mem;
use crate::num::NonZero;
@@ -71,10 +71,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

#[inline]
pub fn sleep(dur: Duration) {
unsafe {
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/itron/thread.rs
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ use super::{
};
use crate::{
cell::UnsafeCell,
ffi::{CStr, CString},
ffi::CStr,
hint, io,
mem::ManuallyDrop,
num::NonZero,
@@ -204,10 +204,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
for timeout in dur2reltims(dur) {
expect_success(unsafe { abi::dly_tsk(timeout) }, &"dly_tsk");
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/sgx/thread.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#![cfg_attr(test, allow(dead_code))] // why is this necessary?
use super::unsupported;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::num::NonZero;
use crate::time::Duration;
@@ -133,10 +133,6 @@ impl Thread {
// which succeeds as-is with the SGX target.
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
usercalls::wait_timeout(0, dur, || true);
}
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/teeos/thread.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use core::convert::TryInto;

use crate::cmp;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::mem;
use crate::num::NonZero;
@@ -101,10 +101,6 @@ impl Thread {
// contact the teeos rustzone team.
}

pub fn get_name() -> Option<CString> {
None
}

/// only main thread could wait for sometime in teeos
pub fn sleep(dur: Duration) {
let sleep_millis = dur.as_millis();
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/uefi/thread.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::unsupported;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::num::NonZero;
use crate::ptr::NonNull;
@@ -23,10 +23,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
let boot_services: NonNull<r_efi::efi::BootServices> =
crate::os::uefi::env::boot_services().expect("can't sleep").cast();
74 changes: 1 addition & 73 deletions library/std/src/sys/pal/unix/thread.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::cmp;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::mem;
use crate::num::NonZero;
@@ -234,78 +234,6 @@ impl Thread {
// Newlib, Emscripten, and VxWorks have no way to set a thread name.
}

#[cfg(any(
target_os = "linux",
target_os = "freebsd",
target_os = "netbsd",
target_os = "solaris",
target_os = "illumos"
))]
pub fn get_name() -> Option<CString> {
#[cfg(target_os = "linux")]
const TASK_COMM_LEN: usize = 16;
#[cfg(target_os = "freebsd")]
const TASK_COMM_LEN: usize = libc::MAXCOMLEN + 1;
#[cfg(any(target_os = "netbsd", target_os = "solaris", target_os = "illumos"))]
const TASK_COMM_LEN: usize = 32;
let mut name = vec![0u8; TASK_COMM_LEN];
let res = unsafe {
libc::pthread_getname_np(libc::pthread_self(), name.as_mut_ptr().cast(), name.len())
};
if res != 0 {
return None;
}
name.truncate(name.iter().position(|&c| c == 0)?);
CString::new(name).ok()
}

#[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos"))]
pub fn get_name() -> Option<CString> {
let mut name = vec![0u8; libc::MAXTHREADNAMESIZE];
let res = unsafe {
libc::pthread_getname_np(libc::pthread_self(), name.as_mut_ptr().cast(), name.len())
};
if res != 0 {
return None;
}
name.truncate(name.iter().position(|&c| c == 0)?);
CString::new(name).ok()
}

#[cfg(target_os = "haiku")]
pub fn get_name() -> Option<CString> {
unsafe {
let mut tinfo = mem::MaybeUninit::<libc::thread_info>::uninit();
// See BeOS teams group and threads api.
// https://www.haiku-os.org/legacy-docs/bebook/TheKernelKit_ThreadsAndTeams_Overview.html
let thread_self = libc::find_thread(ptr::null_mut());
let res = libc::get_thread_info(thread_self, tinfo.as_mut_ptr());
if res != libc::B_OK {
return None;
}
let info = tinfo.assume_init();
let name =
core::slice::from_raw_parts(info.name.as_ptr() as *const u8, info.name.len());
CStr::from_bytes_until_nul(name).map(CStr::to_owned).ok()
}
}

#[cfg(not(any(
target_os = "linux",
target_os = "freebsd",
target_os = "netbsd",
target_os = "macos",
target_os = "ios",
target_os = "tvos",
target_os = "watchos",
target_os = "haiku",
target_os = "solaris",
target_os = "illumos"
)))]
pub fn get_name() -> Option<CString> {
None
}

#[cfg(not(target_os = "espidf"))]
pub fn sleep(dur: Duration) {
let mut secs = dur.as_secs();
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/unsupported/thread.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::unsupported;
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::num::NonZero;
use crate::time::Duration;
@@ -22,10 +22,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(_dur: Duration) {
panic!("can't sleep");
}
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/wasi/thread.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::mem;
use crate::num::NonZero;
@@ -134,10 +134,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
let nanos = dur.as_nanos();
assert!(nanos <= u64::MAX as u128);
4 changes: 0 additions & 4 deletions library/std/src/sys/pal/wasm/atomics/thread.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use crate::ffi::CStr;
use crate::ffi::CString;
use crate::io;
use crate::num::NonZero;
use crate::sys::unsupported;
@@ -18,9 +17,6 @@ impl Thread {
pub fn yield_now() {}

pub fn set_name(_name: &CStr) {}
pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
use crate::arch::wasm32;
24 changes: 0 additions & 24 deletions library/std/src/sys/pal/windows/thread.rs
Original file line number Diff line number Diff line change
@@ -9,7 +9,6 @@ use crate::sys::handle::Handle;
use crate::sys::stack_overflow;
use crate::sys_common::FromInner;
use crate::time::Duration;
use alloc::ffi::CString;
use core::ffi::c_void;

use super::time::WaitableTimer;
@@ -67,29 +66,6 @@ impl Thread {
};
}

pub fn get_name() -> Option<CString> {
unsafe {
let mut ptr = core::ptr::null_mut();
let result = c::GetThreadDescription(c::GetCurrentThread(), &mut ptr);
if result < 0 {
return None;
}
let name = String::from_utf16_lossy({
let mut len = 0;
while *ptr.add(len) != 0 {
len += 1;
}
core::slice::from_raw_parts(ptr, len)
})
.into_bytes();
// Attempt to free the memory.
// This should never fail but if it does then there's not much we can do about it.
let result = c::LocalFree(ptr.cast::<c_void>());
debug_assert!(result.is_null());
if name.is_empty() { None } else { Some(CString::from_vec_unchecked(name)) }
}
}

pub fn join(self) {
let rc = unsafe { c::WaitForSingleObject(self.handle.as_raw_handle(), c::INFINITE) };
if rc == c::WAIT_FAILED {
6 changes: 1 addition & 5 deletions library/std/src/sys/pal/xous/thread.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::ffi::{CStr, CString};
use crate::ffi::CStr;
use crate::io;
use crate::num::NonZero;
use crate::os::xous::ffi::{
@@ -113,10 +113,6 @@ impl Thread {
// nope
}

pub fn get_name() -> Option<CString> {
None
}

pub fn sleep(dur: Duration) {
// Because the sleep server works on units of `usized milliseconds`, split
// the messages up into these chunks. This means we may run into issues
4 changes: 1 addition & 3 deletions library/std/src/thread/mod.rs
Original file line number Diff line number Diff line change
@@ -694,9 +694,7 @@ pub(crate) fn set_current(thread: Thread) {
/// In contrast to the public `current` function, this will not panic if called
/// from inside a TLS destructor.
pub(crate) fn try_current() -> Option<Thread> {
CURRENT
.try_with(|current| current.get_or_init(|| Thread::new(imp::Thread::get_name())).clone())
.ok()
CURRENT.try_with(|current| current.get_or_init(|| Thread::new(None)).clone()).ok()
}

/// Gets a handle to the thread that invokes it.
20 changes: 0 additions & 20 deletions library/std/src/thread/tests.rs
Original file line number Diff line number Diff line change
@@ -70,26 +70,6 @@ fn test_named_thread_truncation() {
result.unwrap().join().unwrap();
}

#[cfg(any(
all(target_os = "windows", not(target_vendor = "win7")),
target_os = "linux",
target_os = "macos",
target_os = "ios",
target_os = "tvos",
target_os = "watchos"
))]
#[test]
fn test_get_os_named_thread() {
use crate::sys::thread::Thread;
// Spawn a new thread to avoid interfering with other tests running on this thread.
let handler = thread::spawn(|| {
let name = c"test me please";
Thread::set_name(name);
assert_eq!(name, Thread::get_name().unwrap().as_c_str());
});
handler.join().unwrap();
}

#[test]
#[should_panic]
fn test_invalid_named_thread() {

0 comments on commit 1bffe75

Please sign in to comment.