body_image/
_mem_handle_ext.rs

1use std::ops::Deref;
2
3#[cfg(unix)] use tao_log::debug;
4use olio::mem::{MemAdvice, MemAdviseError, MemHandle};
5
6use crate::BodyError;
7
8// Extension trait for temporary madvise, here mostly for logging purposes
9pub trait MemHandleExt {
10    fn tmp_advise<F, R, S>(&self, advice: MemAdvice, f: F) -> Result<R, S>
11        where F: FnOnce() -> Result<R, S>,
12              S: From<olio::mem::MemAdviseError>;
13}
14
15impl<T> MemHandleExt for MemHandle<T>
16    where T: Deref<Target=[u8]>
17{
18    fn tmp_advise<F, R, S>(&self, advice: MemAdvice, f: F) -> Result<R, S>
19        where F: FnOnce() -> Result<R, S>,
20              S: From<MemAdviseError>
21    {
22        let _new_advice = self.advise(advice)?;
23
24        #[cfg(unix)]
25        {
26            debug!("MemHandle tmp_advise {:?}, obtained {:?}",
27                   advice, _new_advice);
28        }
29
30        let res = f();
31        self.advise(MemAdvice::Normal)?;
32        res
33    }
34}
35
36impl From<MemAdviseError> for BodyError {
37    fn from(err: MemAdviseError) -> BodyError {
38        BodyError::Io(err.into())
39    }
40}