extern crate libc;
use std::io;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum AccessPattern {
Normal = libc::MADV_NORMAL,
Sequential = libc::MADV_SEQUENTIAL,
Random = libc::MADV_RANDOM,
DontNeed = libc::MADV_DONTNEED,
WillNeed = libc::MADV_WILLNEED,
}
pub trait AdviseMemory {
fn advise_memory_access(&self, advice: AccessPattern) -> io::Result<()>;
}
pub unsafe fn madvise(ptr: *const u8, len: usize, advice: AccessPattern) -> io::Result<()> {
let result = libc::madvise(ptr as *mut libc::c_void, len, advice as libc::c_int);
if result == 0 {
Ok(())
} else {
Err(io::Error::last_os_error())
}
}
#[cfg(unix)]
impl AdviseMemory for [u8] {
fn advise_memory_access(&self, advice: AccessPattern) -> io::Result<()> {
unsafe { madvise(self.as_ptr(), self.len(), advice) }
}
}
#[cfg(not(unix))]
impl AdviseMemory for [u8] {
fn advise_memory_access(&self, _: AccessPattern) -> io::Result<()> {
Ok(())
}
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {}
}