mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
parent
d009f60b55
commit
7d008267dd
@ -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 {
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
@ -228,78 +228,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();
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -69,26 +69,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() {
|
||||
|
Loading…
Reference in New Issue
Block a user