use std::mem::MaybeUninit;
use std::sync::LazyLock;
use winapi::um::processthreadsapi::GetCurrentProcessId;
use winapi::um::sysinfoapi::GetNativeSystemInfo;
use winapi::um::sysinfoapi::SYSTEM_INFO;
use super::Pid;
use crate::Result;
struct SystemInfo {
pagesize: usize,
number_of_logical_cores: usize,
number_of_online_cores: usize,
allocation_granularity: u64,
}
static SYSTEM_INFO: LazyLock<SystemInfo> = LazyLock::new(|| {
let sysinfo = unsafe {
let mut sysinfo = MaybeUninit::<SYSTEM_INFO>::uninit();
GetNativeSystemInfo(sysinfo.as_mut_ptr());
sysinfo.assume_init()
};
SystemInfo {
pagesize: sysinfo.dwPageSize as usize,
number_of_logical_cores: sysinfo.dwNumberOfProcessors as usize,
number_of_online_cores: sysinfo.dwNumberOfProcessors as usize,
allocation_granularity: sysinfo.dwAllocationGranularity.into(),
}
});
pub fn pagesize() -> usize {
SYSTEM_INFO.pagesize
}
pub fn number_of_logical_cores() -> Result<usize> {
Ok(SYSTEM_INFO.number_of_logical_cores)
}
pub fn number_of_online_cores() -> Result<usize> {
Ok(SYSTEM_INFO.number_of_online_cores)
}
pub fn allocation_granularity() -> u64 {
SYSTEM_INFO.allocation_granularity
}
#[inline(always)]
pub fn getpid() -> Pid {
unsafe { GetCurrentProcessId() }
}
pub fn set_thread_name(_name: &str) -> Result<()> {
todo!();
}
pub fn is_cpu_online(_cpu_id: usize) -> Result<bool> {
Ok(true)
}