use std::ffi::c_void;
use std::num::NonZero;
use std::os::fd::BorrowedFd;
use std::ptr::NonNull;
use nix::sys::mman::{mmap, munmap, MapFlags, ProtFlags};
pub(crate) struct Mmap {
ptr: NonNull<c_void>,
len: usize,
}
impl Mmap {
pub fn new(fd: BorrowedFd, len: usize, offset: i64) -> nix::Result<Self> {
let nz = NonZero::new(len).ok_or(nix::errno::Errno::EINVAL)?;
let ptr = unsafe {
mmap(
None,
nz,
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
MapFlags::MAP_SHARED,
fd,
offset,
)?
};
Ok(Self { ptr, len })
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
unsafe { std::slice::from_raw_parts_mut(self.ptr.as_ptr() as *mut u8, self.len) }
}
}
impl Drop for Mmap {
fn drop(&mut self) {
let _ = unsafe { munmap(self.ptr, self.len) };
}
}