use std::io;
pub fn pin_current_thread_to_cpus(cpus: &[usize]) -> io::Result<()> {
#[cfg(target_os = "linux")]
{
crate::syscalls::pin_to_cpus(cpus)
}
#[cfg(not(target_os = "linux"))]
{
let _ = cpus;
Err(io::Error::new(
io::ErrorKind::Unsupported,
"pin_current_thread_to_cpus requires Linux",
))
}
}
pub fn current_thread_cpus() -> io::Result<std::vec::Vec<usize>> {
#[cfg(target_os = "linux")]
{
crate::syscalls::get_cpus()
}
#[cfg(not(target_os = "linux"))]
{
Err(io::Error::new(
io::ErrorKind::Unsupported,
"current_thread_cpus() requires Linux",
))
}
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
mod tests {
use super::*;
#[test]
#[cfg(not(target_os = "linux"))]
fn pin_returns_unsupported_off_linux() {
let err = pin_current_thread_to_cpus(&[0]).unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::Unsupported);
}
#[test]
#[cfg(not(target_os = "linux"))]
fn cpus_returns_unsupported_off_linux() {
let err = current_thread_cpus().unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::Unsupported);
}
#[test]
#[cfg(target_os = "linux")]
fn linux_round_trip_pin_then_read() {
let allowed = current_thread_cpus().expect("getaffinity");
let target = allowed[0];
pin_current_thread_to_cpus(&[target]).expect("setaffinity");
let after = current_thread_cpus().expect("getaffinity post");
assert_eq!(after, std::vec![target]);
pin_current_thread_to_cpus(&allowed).expect("restore");
}
#[test]
#[cfg(target_os = "linux")]
fn linux_empty_input_invalid() {
let err = pin_current_thread_to_cpus(&[]).unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
}
}