1use std::sync::Arc;
2
3use memmap2::Mmap;
4
5use crate::mincore::PageMap;
6
7use super::touch::Touch;
8use super::{FileContext, Op};
9use crate::mlock;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct Lock;
15
16#[derive(Debug)]
18pub struct LockedFile {
19 _mmap: Arc<Mmap>,
20 pub pages_touched: usize,
21}
22
23impl Op for Lock {
24 const LABEL: &str = "locked";
25 const ACTION_SIGN: isize = 1;
26 type Output = LockedFile;
27
28 fn action_pages(
29 output: &LockedFile,
30 _total_pages: usize,
31 _pages_in_core_before: Option<usize>,
32 _pages_in_core_after: usize,
33 ) -> usize {
34 output.pages_touched
35 }
36
37 fn execute<PM: PageMap + Sync>(&self, ctx: &FileContext<'_, PM>) -> crate::Result<LockedFile> {
38 let pages_touched = Touch.execute(ctx)?;
39 mlock::mlock(&ctx.mmap, ctx.len)?;
40 Ok(LockedFile {
41 _mmap: Arc::clone(&ctx.mmap),
42 pages_touched,
43 })
44 }
45}