2020-05-28 10:01:22 +02:00
|
|
|
#![cfg(feature = "use_std")]
|
2020-04-03 11:24:54 +02:00
|
|
|
|
2020-04-07 10:13:38 +02:00
|
|
|
use core::borrow::{Borrow, BorrowMut};
|
2020-04-03 11:30:56 +02:00
|
|
|
use core::ffi::c_void;
|
2020-04-07 14:25:13 +02:00
|
|
|
use core::mem::size_of;
|
2020-04-07 10:13:38 +02:00
|
|
|
use core::ops::{Deref, DerefMut};
|
2020-04-03 11:24:54 +02:00
|
|
|
use core::ptr::null_mut;
|
2020-04-07 14:25:13 +02:00
|
|
|
use core::ptr::Unique;
|
2020-04-03 11:24:54 +02:00
|
|
|
use core::slice::{from_raw_parts, from_raw_parts_mut};
|
2020-04-07 14:25:13 +02:00
|
|
|
use nix::errno::Errno::EINVAL;
|
2020-04-03 11:24:54 +02:00
|
|
|
use nix::sys::mman;
|
|
|
|
|
|
|
|
/* from linux kernel headers.
|
|
|
|
#define HUGETLB_FLAG_ENCODE_SHIFT 26
|
|
|
|
#define HUGETLB_FLAG_ENCODE_MASK 0x3f
|
|
|
|
|
|
|
|
#define HUGETLB_FLAG_ENCODE_64KB (16 << HUGETLB_FLAG_ENCODE_SHIFT)
|
|
|
|
#define HUGETLB_FLAG_ENCODE_512KB (19 << HUGETLB_FLAG_ENCODE_SHIFT)
|
|
|
|
#define HUGETLB_FLAG_ENCODE_1MB (20 << HUGETLB_FLAG_ENCODE_SHIFT)
|
|
|
|
#define HUGETLB_FLAG_ENCODE_2MB (21 << HUGETLB_FLAG_ENCODE_SHIFT)
|
|
|
|
*/
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
pub struct MMappedMemory<T> {
|
|
|
|
pointer: Unique<T>,
|
2020-04-03 11:24:54 +02:00
|
|
|
size: usize,
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> MMappedMemory<T> {
|
2020-11-20 10:52:58 +01:00
|
|
|
pub fn try_new(size: usize, huge: bool) -> Result<MMappedMemory<T>, nix::Error> {
|
2020-04-07 14:25:13 +02:00
|
|
|
assert_ne!(size_of::<T>(), 0);
|
|
|
|
if let Some(p) = unsafe {
|
|
|
|
let p = mman::mmap(
|
|
|
|
null_mut(),
|
|
|
|
size * size_of::<T>(),
|
|
|
|
mman::ProtFlags::PROT_READ | mman::ProtFlags::PROT_WRITE,
|
|
|
|
mman::MapFlags::MAP_PRIVATE
|
|
|
|
| mman::MapFlags::MAP_ANONYMOUS
|
2020-11-20 10:52:58 +01:00
|
|
|
| if huge {
|
|
|
|
mman::MapFlags::MAP_HUGETLB
|
|
|
|
} else {
|
|
|
|
mman::MapFlags::MAP_ANONYMOUS
|
|
|
|
},
|
2020-04-07 14:25:13 +02:00
|
|
|
-1,
|
|
|
|
0,
|
|
|
|
)?;
|
2020-11-20 10:52:58 +01:00
|
|
|
let pointer_T = p as *mut T;
|
|
|
|
Unique::new(pointer_T)
|
2020-04-07 14:25:13 +02:00
|
|
|
} {
|
|
|
|
Ok(MMappedMemory { pointer: p, size })
|
|
|
|
} else {
|
|
|
|
Err(nix::Error::Sys(EINVAL))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-20 10:52:58 +01:00
|
|
|
pub fn new(size: usize, huge: bool) -> MMappedMemory<T> {
|
|
|
|
Self::try_new(size, huge).unwrap()
|
2020-04-03 11:24:54 +02:00
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
pub fn slice(&self) -> &[T] {
|
|
|
|
unsafe { from_raw_parts(self.pointer.as_ptr(), self.size) }
|
2020-04-03 11:24:54 +02:00
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
pub fn slice_mut(&mut self) -> &mut [T] {
|
|
|
|
unsafe { from_raw_parts_mut(self.pointer.as_ptr(), self.size) }
|
2020-04-03 11:24:54 +02:00
|
|
|
}
|
|
|
|
}
|
2020-04-03 11:30:56 +02:00
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> Drop for MMappedMemory<T> {
|
2020-04-03 11:30:56 +02:00
|
|
|
fn drop(&mut self) {
|
|
|
|
unsafe {
|
2020-04-07 14:25:13 +02:00
|
|
|
mman::munmap(self.pointer.as_ptr() as *mut c_void, self.size).unwrap();
|
2020-04-03 11:30:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-04-07 10:13:38 +02:00
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> Deref for MMappedMemory<T> {
|
|
|
|
type Target = [T];
|
2020-04-07 10:13:38 +02:00
|
|
|
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
|
|
self.slice()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> DerefMut for MMappedMemory<T> {
|
2020-04-07 10:13:38 +02:00
|
|
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
|
|
self.slice_mut()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> AsRef<[T]> for MMappedMemory<T> {
|
|
|
|
fn as_ref(&self) -> &[T] {
|
2020-04-07 10:13:38 +02:00
|
|
|
unimplemented!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> AsMut<[T]> for MMappedMemory<T> {
|
|
|
|
fn as_mut(&mut self) -> &mut [T] {
|
2020-04-07 10:13:38 +02:00
|
|
|
self.slice_mut()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> Borrow<[T]> for MMappedMemory<T> {
|
|
|
|
fn borrow(&self) -> &[T] {
|
2020-04-07 10:13:38 +02:00
|
|
|
self.slice()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 14:25:13 +02:00
|
|
|
impl<T> BorrowMut<[T]> for MMappedMemory<T> {
|
|
|
|
fn borrow_mut(&mut self) -> &mut [T] {
|
2020-04-07 10:13:38 +02:00
|
|
|
self.slice_mut()
|
|
|
|
}
|
|
|
|
}
|