std:🧵 set_name implementation proposal for vxWorks.

This commit is contained in:
David Carlier 2024-08-06 19:40:42 +01:00
parent 60d146580c
commit b9e8e99198
No known key found for this signature in database
GPG Key ID: CEF290BB40D2086B

View File

@ -3,7 +3,12 @@ use crate::mem::{self, ManuallyDrop};
use crate::num::NonZero; use crate::num::NonZero;
#[cfg(all(target_os = "linux", target_env = "gnu"))] #[cfg(all(target_os = "linux", target_env = "gnu"))]
use crate::sys::weak::dlsym; use crate::sys::weak::dlsym;
#[cfg(any(target_os = "solaris", target_os = "illumos", target_os = "nto"))] #[cfg(any(
target_os = "solaris",
target_os = "illumos",
target_os = "nto",
target_os = "vxworks"
))]
use crate::sys::weak::weak; use crate::sys::weak::weak;
use crate::sys::{os, stack_overflow}; use crate::sys::{os, stack_overflow};
use crate::time::Duration; use crate::time::Duration;
@ -212,17 +217,38 @@ impl Thread {
} }
} }
#[cfg(target_os = "vxworks")]
pub fn set_name(name: &CStr) {
// FIXME(libc): adding real STATUS, ERROR type eventually.
weak! {
fn taskNameSet(
libc::TASK_ID, *mut libc::c_char
) -> libc::c_int
}
// We can't assume taskNameSet is necessarily available.
// VX_TASK_NAME_LEN can be found set to 31,
// however older versions can be set to only 10.
// FIXME(vxworks): if the minimum supported VxWorks is >= 7, the maximum length can be changed to 31.
if let Some(f) = taskNameSet.get() {
const VX_TASK_NAME_LEN: usize = 10;
let name = truncate_cstr::<{ VX_TASK_NAME_LEN }>(name);
let status = unsafe { f(libc::taskIdSelf(), name.as_mut_ptr()) };
debug_assert_eq!(res, libc::OK);
}
}
#[cfg(any( #[cfg(any(
target_env = "newlib", target_env = "newlib",
target_os = "l4re", target_os = "l4re",
target_os = "emscripten", target_os = "emscripten",
target_os = "redox", target_os = "redox",
target_os = "vxworks",
target_os = "hurd", target_os = "hurd",
target_os = "aix", target_os = "aix",
))] ))]
pub fn set_name(_name: &CStr) { pub fn set_name(_name: &CStr) {
// Newlib, Emscripten, and VxWorks have no way to set a thread name. // Newlib and Emscripten have no way to set a thread name.
} }
#[cfg(not(target_os = "espidf"))] #[cfg(not(target_os = "espidf"))]
@ -291,6 +317,7 @@ impl Drop for Thread {
target_os = "nto", target_os = "nto",
target_os = "solaris", target_os = "solaris",
target_os = "illumos", target_os = "illumos",
target_os = "vxworks",
target_vendor = "apple", target_vendor = "apple",
))] ))]
fn truncate_cstr<const MAX_WITH_NUL: usize>(cstr: &CStr) -> [libc::c_char; MAX_WITH_NUL] { fn truncate_cstr<const MAX_WITH_NUL: usize>(cstr: &CStr) -> [libc::c_char; MAX_WITH_NUL] {