use super::super::*;
use core::sync::atomic::{AtomicUsize, Ordering};
use mnemosyne_core::MemoryBackend;
pub(super) struct MockBackend;
pub(super) static ALLOC_COUNT: AtomicUsize = AtomicUsize::new(0);
pub(super) static DEALLOC_COUNT: AtomicUsize = AtomicUsize::new(0);
pub(super) static MOCK_POOLS: mnemosyne_arena::segment::pool::BackendPools =
mnemosyne_arena::segment::pool::BackendPools::new();
impl MemoryBackend for MockBackend {
unsafe fn allocate(size: usize) -> *mut u8 {
ALLOC_COUNT.fetch_add(1, Ordering::SeqCst);
unsafe { DefaultBackend::allocate(size) }
}
unsafe fn deallocate(ptr: *mut u8, size: usize) -> bool {
DEALLOC_COUNT.fetch_add(1, Ordering::SeqCst);
unsafe { DefaultBackend::deallocate(ptr, size) }
}
}
impl mnemosyne_arena::segment::pool::private::Sealed for MockBackend {}
impl HasSegmentPool for MockBackend {
#[inline(always)]
fn pools() -> &'static mnemosyne_arena::segment::pool::BackendPools {
&MOCK_POOLS
}
}
crate::impl_local_allocator_selector!(MockBackend);
crate::impl_local_allocator_selector!(DefaultBackend);
pub(crate) unsafe fn drain_all_pools() {
use mnemosyne_arena::HasSegmentPool;
unsafe {
while let Some(seg) = <DefaultBackend as HasSegmentPool>::global_orphan_pool().pop() {
mnemosyne_arena::deallocate_segment::<DefaultBackend>(seg);
}
while let Some(seg) =
<mnemosyne_backend::MemoryBackendWrapper as HasSegmentPool>::global_orphan_pool().pop()
{
mnemosyne_arena::deallocate_segment::<mnemosyne_backend::MemoryBackendWrapper>(seg);
}
mnemosyne_arena::purge_segment_pool::<DefaultBackend>();
mnemosyne_arena::purge_segment_pool::<mnemosyne_backend::MemoryBackendWrapper>();
}
}