use crate::DefaultBackend;
use crate::recorders::{record_map, record_unmap, record_unmap_failure};
use mnemosyne_core::MemoryBackend;
pub struct MemoryBackendWrapper;
#[inline(always)]
pub(crate) fn do_allocate<B: MemoryBackend>(size: usize) -> *mut u8 {
let ptr = unsafe { B::allocate(size) };
if !ptr.is_null() {
record_map(size);
}
ptr
}
#[inline(always)]
pub(crate) fn do_deallocate<B: MemoryBackend>(ptr: *mut u8, size: usize) -> bool {
if ptr.is_null() {
return false;
}
let released = {
unsafe { B::deallocate(ptr, size) }
};
if released {
record_unmap(size);
} else {
record_unmap_failure();
}
released
}
impl MemoryBackend for MemoryBackendWrapper {
const SUPPORTS_PAGE_RESET: bool = DefaultBackend::SUPPORTS_PAGE_RESET;
const SUPPORTS_MAKE_GUARD: bool = DefaultBackend::SUPPORTS_MAKE_GUARD;
const SUPPORTS_DECOMMIT: bool = DefaultBackend::SUPPORTS_DECOMMIT;
const ENABLE_CPU_CACHE: bool = DefaultBackend::ENABLE_CPU_CACHE;
#[inline(always)]
unsafe fn allocate(size: usize) -> *mut u8 {
do_allocate::<DefaultBackend>(size)
}
#[inline(always)]
unsafe fn deallocate(ptr: *mut u8, size: usize) -> bool {
do_deallocate::<DefaultBackend>(ptr, size)
}
#[inline(always)]
unsafe fn make_guard(ptr: *mut u8, size: usize) -> bool {
crate::guard::do_make_guard::<DefaultBackend>(ptr, size)
}
#[inline(always)]
unsafe fn page_reset(ptr: *mut u8, size: usize) -> bool {
crate::reset::do_page_reset::<DefaultBackend>(ptr, size)
}
#[inline(always)]
unsafe fn decommit(ptr: *mut u8, size: usize) -> bool {
crate::reset::do_decommit::<DefaultBackend>(ptr, size)
}
}