about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-09-15 12:24:31 +0200
committerRalf Jung <post@ralfj.de>2024-09-15 12:45:29 +0200
commitcb445d0188187c4f00dd23cdd6635e08f79ebaae (patch)
tree84f57a11e908b577e36bfe39b1862134a25d6a0a
parent75921d2ca4477819342dea2a428535a565683031 (diff)
downloadrust-cb445d0188187c4f00dd23cdd6635e08f79ebaae.tar.gz
rust-cb445d0188187c4f00dd23cdd6635e08f79ebaae.zip
make pthread-threadname nicer with cfg-if
-rw-r--r--src/tools/miri/test_dependencies/Cargo.lock1
-rw-r--r--src/tools/miri/test_dependencies/Cargo.toml1
-rw-r--r--src/tools/miri/tests/pass-dep/libc/pthread-threadname.rs55
3 files changed, 39 insertions, 18 deletions
diff --git a/src/tools/miri/test_dependencies/Cargo.lock b/src/tools/miri/test_dependencies/Cargo.lock
index 39d41281728..9a4431eb704 100644
--- a/src/tools/miri/test_dependencies/Cargo.lock
+++ b/src/tools/miri/test_dependencies/Cargo.lock
@@ -172,6 +172,7 @@ dependencies = [
 name = "miri-test-deps"
 version = "0.1.0"
 dependencies = [
+ "cfg-if",
  "getrandom 0.1.16",
  "getrandom 0.2.15",
  "libc",
diff --git a/src/tools/miri/test_dependencies/Cargo.toml b/src/tools/miri/test_dependencies/Cargo.toml
index c24422df26c..e7eff46afca 100644
--- a/src/tools/miri/test_dependencies/Cargo.toml
+++ b/src/tools/miri/test_dependencies/Cargo.toml
@@ -11,6 +11,7 @@ edition = "2021"
 # all dependencies (and their transitive ones) listed here can be used in `tests/`.
 libc = "0.2"
 num_cpus = "1.10.1"
+cfg-if = "1"
 
 getrandom_01 = { package = "getrandom", version = "0.1" }
 getrandom_02 = { package = "getrandom", version = "0.2", features = ["js"] }
diff --git a/src/tools/miri/tests/pass-dep/libc/pthread-threadname.rs b/src/tools/miri/tests/pass-dep/libc/pthread-threadname.rs
index d66cd3bbb03..8be42b50897 100644
--- a/src/tools/miri/tests/pass-dep/libc/pthread-threadname.rs
+++ b/src/tools/miri/tests/pass-dep/libc/pthread-threadname.rs
@@ -10,16 +10,42 @@ fn main() {
         .collect::<String>();
 
     fn set_thread_name(name: &CStr) -> i32 {
-        #[cfg(any(target_os = "linux", target_os = "illumos", target_os = "solaris"))]
-        return unsafe { libc::pthread_setname_np(libc::pthread_self(), name.as_ptr().cast()) };
-        #[cfg(target_os = "freebsd")]
-        unsafe {
-            // pthread_set_name_np does not return anything
-            libc::pthread_set_name_np(libc::pthread_self(), name.as_ptr().cast());
-            return 0;
-        };
-        #[cfg(target_os = "macos")]
-        return unsafe { libc::pthread_setname_np(name.as_ptr().cast()) };
+        cfg_if::cfg_if! {
+            if #[cfg(any(target_os = "linux", target_os = "illumos", target_os = "solaris"))] {
+                unsafe { libc::pthread_setname_np(libc::pthread_self(), name.as_ptr().cast()) }
+            } else if #[cfg(target_os = "freebsd")] {
+                // pthread_set_name_np does not return anything
+                unsafe { libc::pthread_set_name_np(libc::pthread_self(), name.as_ptr().cast()) };
+                0
+            } else if #[cfg(target_os = "macos")] {
+                unsafe { libc::pthread_setname_np(name.as_ptr().cast()) }
+            } else {
+                compile_error!("set_thread_name not supported for this OS")
+            }
+        }
+    }
+
+    fn get_thread_name(name: &mut [u8]) -> i32 {
+        cfg_if::cfg_if! {
+            if #[cfg(any(
+                target_os = "linux",
+                target_os = "illumos",
+                target_os = "solaris",
+                target_os = "macos"
+            ))] {
+                unsafe {
+                    libc::pthread_getname_np(libc::pthread_self(), name.as_mut_ptr().cast(), name.len())
+                }
+            } else if #[cfg(target_os = "freebsd")] {
+                // pthread_get_name_np does not return anything
+                unsafe {
+                    libc::pthread_get_name_np(libc::pthread_self(), name.as_mut_ptr().cast(), name.len())
+                };
+                0
+            } else {
+                compile_error!("get_thread_name not supported for this OS")
+            }
+        }
     }
 
     let result = thread::Builder::new().name(long_name.clone()).spawn(move || {
@@ -28,14 +54,7 @@ fn main() {
 
         // But the system is limited -- make sure we successfully set a truncation.
         let mut buf = vec![0u8; long_name.len() + 1];
-        #[cfg(not(target_os = "freebsd"))]
-        unsafe {
-            libc::pthread_getname_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
-        };
-        #[cfg(target_os = "freebsd")]
-        unsafe {
-            libc::pthread_get_name_np(libc::pthread_self(), buf.as_mut_ptr().cast(), buf.len())
-        };
+        assert_eq!(get_thread_name(&mut buf), 0);
         let cstr = CStr::from_bytes_until_nul(&buf).unwrap();
         assert!(cstr.to_bytes().len() >= 15, "name is too short: len={}", cstr.to_bytes().len()); // POSIX seems to promise at least 15 chars
         assert!(long_name.as_bytes().starts_with(cstr.to_bytes()));