Skip to main content

pagers_core/
mlock.rs

1use std::ptr::NonNull;
2
3use memmap2::Mmap;
4use nix::errno::Errno;
5use nix::sys::mman::{MlockAllFlags, mlockall};
6
7use crate::error::MlockError;
8
9pub fn mlock(mmap: &Mmap, len: usize) -> crate::Result<()> {
10    // SAFETY: mmap.as_ptr() points to a valid memory-mapped region of at least `len` bytes.
11    let addr = NonNull::new(mmap.as_ptr() as *mut std::ffi::c_void)
12        .expect("mmap pointer should never be null");
13    unsafe { nix::sys::mman::mlock(addr, len) }.map_err(|e| match e {
14        Errno::EPERM => MlockError::PermissionDenied { call: "mlock" },
15        Errno::ENOMEM => MlockError::OutOfMemory { call: "mlock", len },
16        other => MlockError::Other {
17            call: "mlock",
18            source: other.into(),
19        },
20    })?;
21    Ok(())
22}
23
24pub fn mlockall_current() -> crate::Result<()> {
25    mlockall(MlockAllFlags::MCL_CURRENT).map_err(|e| match e {
26        Errno::EPERM => MlockError::PermissionDenied { call: "mlockall" },
27        Errno::ENOMEM => MlockError::OutOfMemory {
28            call: "mlockall",
29            len: 0,
30        },
31        other => MlockError::Other {
32            call: "mlockall",
33            source: other.into(),
34        },
35    })?;
36    Ok(())
37}