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 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}