#![cfg(feature = "mimalloc")]
use commonware_allocator::mimalloc::{
ARENA_CHUNK_SIZE, ARENA_MAX_OBJECT_SIZE, ARENA_SLICE_SIZE, Config, Effective, MiMalloc, Stats,
};
use std::{
alloc::{Layout, alloc, dealloc},
hint::black_box,
};
#[global_allocator]
static GLOBAL: MiMalloc = MiMalloc::new(Config::DEFAULT);
fn stats() -> Stats {
Stats::read().expect("stats must be available")
}
#[test]
fn huge_objects_are_placed_as_documented() {
assert_eq!(
Effective::read().arena_max_object_size,
ARENA_MAX_OBJECT_SIZE
);
let before = stats();
let page = black_box(Vec::<u8>::with_capacity(ARENA_MAX_OBJECT_SIZE));
let held = stats();
drop(page);
let after = stats();
assert_eq!(held.huge_allocations, before.huge_allocations + 1);
assert_eq!(after.reserved_bytes, held.reserved_bytes);
let size = ARENA_MAX_OBJECT_SIZE + ARENA_SLICE_SIZE;
let before = stats();
let page = black_box(Vec::<u8>::with_capacity(size));
let held = stats();
drop(page);
let after = stats();
assert_eq!(held.huge_allocations, before.huge_allocations + 1);
assert_eq!(held.arenas, before.arenas);
assert!(held.mmap_calls > before.mmap_calls);
assert!(held.reserved_bytes >= before.reserved_bytes + size as u64);
assert!(held.reserved_bytes >= after.reserved_bytes + size as u64);
let aligned = Layout::from_size_align(64, 2 * ARENA_SLICE_SIZE).expect("layout must be valid");
let before = stats();
let block = black_box(unsafe { alloc(aligned) });
assert!(!block.is_null() && block.addr().is_multiple_of(aligned.align()));
let held = stats();
unsafe { dealloc(block, aligned) };
let after = stats();
assert!(held.mmap_calls > before.mmap_calls);
assert!(held.reserved_bytes >= after.reserved_bytes + ARENA_SLICE_SIZE as u64);
let group = size_of::<usize>() * ARENA_CHUNK_SIZE;
let refused = Layout::from_size_align(64, group).expect("layout must be valid");
assert!(black_box(unsafe { alloc(refused) }).is_null());
}