use std::fs::File;
use std::path::Path;
use memmap::Mmap;
#[derive(Clone, Debug, Copy)]
pub struct MmapChoice(MmapChoiceImpl);
#[derive(Clone, Debug, Copy)]
enum MmapChoiceImpl {
Auto,
Never,
}
impl Default for MmapChoice {
fn default() -> MmapChoice {
MmapChoice(MmapChoiceImpl::Never)
}
}
impl MmapChoice {
pub unsafe fn auto() -> MmapChoice {
MmapChoice(MmapChoiceImpl::Auto)
}
pub fn never() -> MmapChoice {
MmapChoice(MmapChoiceImpl::Never)
}
pub(crate) fn open<P: AsRef<Path>>(&self, file: &File, path: Option<&P>) -> Option<Mmap> {
if !self.is_enabled() {
return None;
}
if !cfg!(target_pointer_width = "64") {
return None;
}
if cfg!(target_os = "macos") {
return None;
}
match unsafe { Mmap::map(file) } {
Ok(mmap) => Some(mmap),
Err(err) => {
if let Some(path) = path {
log::debug!(
"{}: failed to open memory map: {}",
path.as_ref().display(),
err
);
} else {
log::debug!("failed to open memory map: {}", err);
}
None
}
}
}
pub(crate) fn is_enabled(&self) -> bool {
match self.0 {
MmapChoiceImpl::Auto => true,
MmapChoiceImpl::Never => false,
}
}
}