zerodds_rt_linux/
affinity.rs1use std::io;
11
12pub fn pin_current_thread_to_cpus(cpus: &[usize]) -> io::Result<()> {
30 #[cfg(target_os = "linux")]
31 {
32 crate::syscalls::pin_to_cpus(cpus)
33 }
34 #[cfg(not(target_os = "linux"))]
35 {
36 let _ = cpus;
37 Err(io::Error::new(
38 io::ErrorKind::Unsupported,
39 "pin_current_thread_to_cpus requires Linux",
40 ))
41 }
42}
43
44pub fn current_thread_cpus() -> io::Result<std::vec::Vec<usize>> {
50 #[cfg(target_os = "linux")]
51 {
52 crate::syscalls::get_cpus()
53 }
54 #[cfg(not(target_os = "linux"))]
55 {
56 Err(io::Error::new(
57 io::ErrorKind::Unsupported,
58 "current_thread_cpus() requires Linux",
59 ))
60 }
61}
62
63#[cfg(test)]
64#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
65mod tests {
66 use super::*;
67
68 #[test]
69 #[cfg(not(target_os = "linux"))]
70 fn pin_returns_unsupported_off_linux() {
71 let err = pin_current_thread_to_cpus(&[0]).unwrap_err();
72 assert_eq!(err.kind(), io::ErrorKind::Unsupported);
73 }
74
75 #[test]
76 #[cfg(not(target_os = "linux"))]
77 fn cpus_returns_unsupported_off_linux() {
78 let err = current_thread_cpus().unwrap_err();
79 assert_eq!(err.kind(), io::ErrorKind::Unsupported);
80 }
81
82 #[test]
83 #[cfg(target_os = "linux")]
84 fn linux_round_trip_pin_then_read() {
85 let allowed = current_thread_cpus().expect("getaffinity");
86 let target = allowed[0];
87 pin_current_thread_to_cpus(&[target]).expect("setaffinity");
88 let after = current_thread_cpus().expect("getaffinity post");
89 assert_eq!(after, std::vec![target]);
90 pin_current_thread_to_cpus(&allowed).expect("restore");
92 }
93
94 #[test]
95 #[cfg(target_os = "linux")]
96 fn linux_empty_input_invalid() {
97 let err = pin_current_thread_to_cpus(&[]).unwrap_err();
98 assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
99 }
100}