use core::{alloc::Layout, ptr::NonNull};
use std::io;
pub mod unix;
pub mod windows;
pub trait SecretAllocator {
fn alloc(layout: Layout) -> io::Result<NonNull<u8>>;
fn make_read_only(ptr: NonNull<u8>, layout: Layout) -> io::Result<()>;
fn make_writable(ptr: NonNull<u8>, layout: Layout) -> io::Result<()>;
fn dealloc(ptr: NonNull<u8>, layout: Layout) -> io::Result<()>;
}
mod util {
use std::sync::OnceLock;
pub fn page_size() -> usize {
static PAGE_SIZE: OnceLock<usize> = OnceLock::new();
*PAGE_SIZE.get_or_init(|| {
#[cfg(target_family = "unix")]
{
#[cfg(target_os = "macos")]
unsafe {
libc::vm_page_size as usize
}
#[cfg(not(target_os = "macos"))]
unsafe {
libc::sysconf(libc::_SC_PAGESIZE) as usize
}
}
#[cfg(target_family = "windows")]
{
use std::mem::MaybeUninit;
use windows_sys::Win32::System::SystemInformation as Win32;
let sys_info = {
let mut sys_info = MaybeUninit::<Win32::SYSTEM_INFO>::uninit();
unsafe {
Win32::GetSystemInfo(sys_info.as_mut_ptr());
sys_info.assume_init()
}
};
sys_info.dwPageSize as usize
}
})
}
}