uapi 0.2.13

Wrappers for OS APIs on UNIX-like platform
Documentation
use crate::*;
use std::{mem, mem::MaybeUninit};

#[man(sched_setaffinity(2))]
pub fn sched_setaffinity(pid: c::pid_t, mask: &[usize]) -> Result<()> {
    unsafe {
        let res = c::syscall(
            c::SYS_sched_setaffinity,
            pid as usize,
            mem::size_of_val(mask),
            mask.as_ptr() as usize,
        );
        map_err!(res).map(drop)
    }
}

#[man(sched_getaffinity(2))]
pub fn sched_getaffinity(pid: c::pid_t, mask: &mut [usize]) -> Result<usize> {
    unsafe {
        let res = c::syscall(
            c::SYS_sched_getaffinity,
            pid as usize,
            mem::size_of_val(mask),
            mask.as_mut_ptr() as usize,
        );
        map_err!(res).map(|v| v as usize)
    }
}

#[man(sched_setattr(2))]
pub fn sched_setattr(
    pid: c::pid_t,
    attr: &c::sched_attr,
    flags: c::c_uint,
) -> Result<()> {
    unsafe {
        let mut attr = *attr;
        attr.size = mem::size_of_val(&attr) as u32;
        let res = c::sched_setattr(pid, &mut attr, flags);
        map_err!(res).map(drop)
    }
}

#[man(sched_getattr(2))]
pub fn sched_getattr(pid: c::pid_t, flags: c::c_uint) -> Result<c::sched_attr> {
    unsafe {
        let mut attr = MaybeUninit::uninit();
        let size = mem::size_of_val(&attr) as c::c_uint;
        let res = c::sched_getattr(pid, attr.as_mut_ptr(), size, flags);
        map_err!(res)?;
        Ok(attr.assume_init())
    }
}

#[man(sched_setscheduler(2))]
pub fn sched_setscheduler(
    pid: c::pid_t,
    policy: c::c_int,
    param: &c::sched_param,
) -> Result<c::c_int> {
    unsafe {
        let res = c::sched_setscheduler(pid, policy, param);
        map_err!(res)
    }
}

#[man(sched_getscheduler(2))]
pub fn sched_getscheduler(pid: c::pid_t) -> Result<c::c_int> {
    unsafe {
        let res = c::sched_getscheduler(pid);
        map_err!(res)
    }
}

#[man(sched_setparam(2))]
pub fn sched_setparam(pid: c::pid_t, param: &c::sched_param) -> Result<()> {
    unsafe {
        let res = c::sched_setparam(pid, param);
        map_err!(res).map(drop)
    }
}

#[man(sched_getparam(2))]
pub fn sched_getparam(pid: c::pid_t) -> Result<c::sched_param> {
    unsafe {
        let mut param = MaybeUninit::uninit();
        let res = c::sched_getparam(pid, param.as_mut_ptr());
        map_err!(res)?;
        Ok(param.assume_init())
    }
}

#[man(sched_get_priority_max(2))]
pub fn sched_get_priority_max(policy: c::c_int) -> Result<c::c_int> {
    unsafe {
        let res = c::sched_get_priority_max(policy);
        map_err!(res)
    }
}

#[man(sched_get_priority_min(2))]
pub fn sched_get_priority_min(policy: c::c_int) -> Result<c::c_int> {
    unsafe {
        let res = c::sched_get_priority_min(policy);
        map_err!(res)
    }
}

#[man(sched_rr_get_interval(2))]
pub fn sched_rr_get_interval(pid: c::pid_t) -> Result<c::timespec> {
    unsafe {
        let mut tp = MaybeUninit::uninit();
        let res = c::sched_rr_get_interval(pid, tp.as_mut_ptr());
        map_err!(res)?;
        Ok(tp.assume_init())
    }
}