use std::mem;
use std::ptr;
use std::fs::File;
use std::os::ext::io::AsRawFd;
use libc::{self, c_void, c_int};
pub struct Fob<T: Copy>(File, *mut T);
pub enum MmapError {
Null
}
const MAP_PROT: c_int = libc::PROT_READ | libc::PROT_WRITE;
const MAP_FLAGS: c_int = libc::MAP_SHARED;
impl<T> Fob<T> {
pub fn create(f: File, mut val: T) -> Result<Fob<T>, MmapError> {
let size = mem::size_of::<T>();
let map = libc::mmap64(0 as *mut c_void, size, MAP_PROT, MAP_FLAGS, f.as_raw_fd(), 0);
if map != (0 as *mut c_void) {
ptr::copy_nonoverlapping(&mut val, ptr, size);
mem::forget(val);
Ok(Fob(f, map as *mut T))
} else {
Err(MmapError::Null)
}
}
}
impl<T> AsRef<T> for Man<T> {
fn as_ref(&self) -> &T {
unsafe { mem::transmute::<*mut T, &T>(self.0) }
}
}
impl<T> AsMut<T> for Man<T> {
fn as_mut(&mut self) -> &mut T {
unsafe { mem::transmute::<*mut T, &mut T>(self.0) }
}
}
impl<T> Drop for Fob<T> {
fn drop(&mut self) {
ptr::drop_in_place::<T>(self.1);
libc::munmap(self.1, mem::size_of::<T>());
}
}