use std::ptr;
pub struct RamBlock {
ptr: *mut u8,
size: u64,
}
impl RamBlock {
pub fn new(size: u64) -> Self {
let ptr = unsafe {
libc::mmap(
ptr::null_mut(),
size as usize,
libc::PROT_READ | libc::PROT_WRITE,
libc::MAP_PRIVATE | libc::MAP_ANONYMOUS,
-1,
0,
) as *mut u8
};
assert!(
!ptr.is_null() && ptr != libc::MAP_FAILED as *mut u8,
"mmap failed for size {size}"
);
Self { ptr, size }
}
pub fn as_ptr(&self) -> *mut u8 {
self.ptr
}
pub fn size(&self) -> u64 {
self.size
}
}
unsafe impl Send for RamBlock {}
unsafe impl Sync for RamBlock {}
impl Drop for RamBlock {
fn drop(&mut self) {
unsafe {
libc::munmap(self.ptr as *mut libc::c_void, self.size as usize);
}
}
}