#[cfg(target_os = "linux")]
pub fn set_idle_cpu() -> std::io::Result<()> {
let mut param: libc::sched_param = unsafe { std::mem::zeroed() };
param.sched_priority = 0;
let rc = unsafe { libc::sched_setscheduler(0, libc::SCHED_IDLE, ¶m) };
if rc == -1 {
Err(std::io::Error::last_os_error())
} else {
Ok(())
}
}
#[cfg(target_os = "linux")]
pub fn lower_nice() -> std::io::Result<()> {
let rc = unsafe { libc::setpriority(libc::PRIO_PROCESS, 0, 19) };
if rc == -1 {
Err(std::io::Error::last_os_error())
} else {
Ok(())
}
}
#[cfg(all(test, target_os = "linux"))]
mod tests {
use super::*;
#[test]
fn set_idle_cpu_succeeds_and_restores() {
let orig = unsafe { libc::sched_getscheduler(0) };
assert!(set_idle_cpu().is_ok());
let mut param: libc::sched_param = unsafe { std::mem::zeroed() };
param.sched_priority = 0;
unsafe { libc::sched_setscheduler(0, orig.max(0), ¶m) };
}
}