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