jay-compositor 1.15.0

The Jay compositor
use jay_algorithms::oserror::OsError;
use jay_algorithms::oserror::OsErrorExt;
use smallvec::SmallVec;
use smallvec::smallvec_inline;
use uapi::c;

#[cfg_attr(not(feature = "it"), expect(unused))]
pub fn num_cpus() -> Result<u32, OsError> {
    let mut buf: SmallVec<[usize; 32]> = smallvec_inline![0; 32];
    loop {
        match uapi::sched_getaffinity(0, &mut buf).to_os_error() {
            Ok(_) => return Ok(count(&buf)),
            Err(OsError(c::EINVAL)) => buf.extend_from_slice(&[0; 32][..]),
            Err(e) => return Err(e),
        }
    }
}

fn count(buf: &[usize]) -> u32 {
    buf.iter().copied().map(|n| n.count_ones()).sum()
}