use crate::platform;
use crate::util::{align_up, page_size};
pub struct LargeAlloc {
pub base: *mut u8,
pub total_size: usize,
pub user_ptr: *mut u8,
pub data_size: usize,
pub requested_size: usize,
}
impl LargeAlloc {
pub unsafe fn create(size: usize) -> Option<Self> {
let data_size = align_up(size, page_size());
#[cfg(feature = "guard-pages")]
let total_size = page_size() + data_size + page_size();
#[cfg(not(feature = "guard-pages"))]
let total_size = data_size;
let base = platform::map_anonymous(total_size);
if base.is_null() {
return None;
}
#[cfg(feature = "guard-pages")]
{
platform::protect_none(base, page_size());
platform::protect_none(base.add(page_size() + data_size), page_size());
}
#[cfg(feature = "guard-pages")]
let user_ptr = base.add(page_size());
#[cfg(not(feature = "guard-pages"))]
let user_ptr = base;
Some(LargeAlloc {
base,
total_size,
user_ptr,
data_size,
requested_size: size,
})
}
pub unsafe fn destroy(&self) {
platform::unmap(self.base, self.total_size);
}
}