in src/lib.rs [831:866]
fn on_checkpoint(
&mut self,
address: usize,
len: usize,
page_size: usize,
) -> Result<(), RuntimeError> {
use libc::mincore;
let mem_size = len * size_of::<usize>();
let aligned_address = address / page_size * page_size;
let aligned_mem_size = mem_size + (address - aligned_address);
// buf needs to be at least (aligned_mem_size + page_size - 1) / page_size
let mut buf: Vec<u8> = vec![0; aligned_mem_size.div_ceil(page_size)];
assert_eq!(
unsafe {
mincore(
aligned_address as *mut std::ffi::c_void,
aligned_mem_size,
buf.as_mut_ptr().cast(),
)
},
0,
"mincore did not return 0"
);
if buf.iter().any(|n| *n & 1 == 0) {
trace!("Detected page fault");
return Err(RuntimeError::PageFault);
}
self.set_next_checkpoint();
self.completed_iter += 1;
Ok(())
}