body_image/
_mem_handle_ext.rs1use std::ops::Deref;
2
3#[cfg(unix)] use tao_log::debug;
4use olio::mem::{MemAdvice, MemAdviseError, MemHandle};
5
6use crate::BodyError;
7
8pub 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}