use libc::size_t;
use std::ffi::c_void;
#[cfg(windows)]
use windows::Win32::System::{Memory, SystemInformation};
#[cfg(unix)]
use libc::{mmap, munmap, MAP_ANON, MAP_PRIVATE, PROT_READ, PROT_WRITE};
#[cfg(unix)]
use std::ptr::null_mut;
#[cfg(unix)]
pub fn allocate(size: size_t) -> *mut c_void {
unsafe {
mmap(
null_mut(),
size,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON,
-1,
0,
)
}
}
#[cfg(unix)]
pub unsafe fn deallocate(ptr: *mut c_void, size: size_t) -> i32 {
munmap(ptr, size)
}
#[cfg(windows)]
pub fn allocate(size: usize) -> *mut c_void {
unsafe {
let protection = Memory::PAGE_READWRITE;
let flags = Memory::MEM_RESERVE | Memory::MEM_COMMIT;
let address = Memory::VirtualAlloc(None, size, flags, protection);
address
}
}
#[cfg(windows)]
pub unsafe fn deallocate(ptr: *mut c_void, size: size_t) -> i32 {
let length = 0;
let flags = Memory::MEM_RELEASE;
match Memory::VirtualFree(ptr, length, flags) {
Ok(()) => 0,
_ => -1,
}
}