heim-cpu 0.0.4

Cross-platform CPU information
Documentation
use std::ptr;
use std::mem;

use winapi::um::{winbase, winnt, sysinfoapi};

use heim_common::prelude::*;


pub fn logical_count() -> impl Future<Output = Result<u64>> {
    let result = unsafe {
        winbase::GetActiveProcessorCount(winnt::ALL_PROCESSOR_GROUPS)
    };

    if result > 0 {
        future::ok(u64::from(result))
    } else {
        future::err(Error::last_os_error())
    }
}

pub fn physical_count() -> impl Future<Output = Result<Option<u64>>> {
    let mut buffer_size = 0;

    let _ = unsafe {
        sysinfoapi::GetLogicalProcessorInformationEx(
            winnt::RelationProcessorCore,
            ptr::null_mut(),
            &mut buffer_size)
    };

    let struct_size = mem::size_of::<winnt::SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>() as u32;
    let length = buffer_size / struct_size;
    let mut buf = Vec::with_capacity(length as usize);


    let result = unsafe {
        sysinfoapi::GetLogicalProcessorInformationEx(
            winnt::RelationProcessorCore,
            buf.as_mut_ptr(),
            &mut buffer_size)
    };

    if result == 0 {
        return future::err(Error::last_os_error())
    } else {
        unsafe {
            buf.set_len(length as usize);
        }
    }

    if buf.len() > 0 {
        future::ok(Some(buf.len() as u64))
    } else {
        future::ok(None)
    }
}