use crate::process::Pid;
use crate::{imp, io};
#[repr(C)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct CpuSet {
cpu_set: imp::process::RawCpuSet,
}
impl CpuSet {
pub const MAX_CPU: usize = imp::process::CPU_SETSIZE;
#[inline]
pub fn new() -> Self {
Self {
cpu_set: imp::process::raw_cpu_set_new(),
}
}
#[inline]
pub fn is_set(&self, field: usize) -> bool {
imp::process::cpu_set::CPU_ISSET(field, &self.cpu_set)
}
#[inline]
pub fn set(&mut self, field: usize) {
imp::process::cpu_set::CPU_SET(field, &mut self.cpu_set)
}
#[inline]
pub fn unset(&mut self, field: usize) {
imp::process::cpu_set::CPU_CLR(field, &mut self.cpu_set)
}
#[cfg(any(target_os = "android", target_os = "linux"))]
#[inline]
pub fn count(&self) -> u32 {
imp::process::cpu_set::CPU_COUNT(&self.cpu_set)
}
#[inline]
pub fn clear(&mut self) {
imp::process::cpu_set::CPU_ZERO(&mut self.cpu_set)
}
}
#[inline]
pub fn sched_setaffinity(pid: Option<Pid>, cpuset: &CpuSet) -> io::Result<()> {
imp::process::syscalls::sched_setaffinity(pid, &cpuset.cpu_set)
}
#[inline]
pub fn sched_getaffinity(pid: Option<Pid>) -> io::Result<CpuSet> {
let mut cpuset = CpuSet::new();
imp::process::syscalls::sched_getaffinity(pid, &mut cpuset.cpu_set).and(Ok(cpuset))
}