Skip to main content

pagers_core/ops/
lockall.rs

1use crate::mincore::PageMap;
2
3use super::lock::{Lock, LockedFile};
4use super::{FileContext, Op};
5use crate::mlock;
6
7/// [`Lock`] + `mlockall(MCL_CURRENT)` after all files.
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub struct Lockall;
11
12impl Op for Lockall {
13    const LABEL: &str = "locked";
14    const ACTION_SIGN: isize = 1;
15    type Output = LockedFile;
16
17    fn action_pages(
18        output: &LockedFile,
19        _total_pages: usize,
20        _pages_in_core_before: Option<usize>,
21        _pages_in_core_after: usize,
22    ) -> usize {
23        output.pages_touched
24    }
25
26    fn execute<PM: PageMap + Sync>(&self, ctx: &FileContext<'_, PM>) -> crate::Result<LockedFile> {
27        Lock.execute(ctx)
28    }
29
30    fn finish(&self) -> crate::Result<()> {
31        mlock::mlockall_current()?;
32        Ok(())
33    }
34}