#![cfg(feature = "lazy-commit")]
#![allow(clippy::let_unit_value)]
use aligned_vmem::{
commit_range, page_size, reserve_aligned, reserve_aligned_lazy, try_commit_range, PAGE,
};
#[cfg(all(windows, feature = "bench-internals", not(aligned_vmem_mock)))]
use std::sync::Mutex;
const MIB: usize = 1024 * 1024;
#[cfg(all(windows, feature = "bench-internals", not(aligned_vmem_mock)))]
static SERIAL: Mutex<()> = Mutex::new(());
#[cfg(all(windows, feature = "bench-internals", not(aligned_vmem_mock)))]
fn serial_guard() -> std::sync::MutexGuard<'static, ()> {
SERIAL.lock().unwrap_or_else(|e| e.into_inner())
}
#[cfg(not(all(windows, feature = "bench-internals", not(aligned_vmem_mock))))]
fn serial_guard() {}
#[test]
fn lazy_reserve_basic_write_initial_region() {
let _guard = serial_guard();
let initial = 16 * PAGE; let span = 4 * MIB;
let r = reserve_aligned_lazy(span, span, initial).expect("lazy reserve 4 MiB");
let base = r.as_ptr();
assert!(!base.is_null());
assert_eq!(base as usize % span, 0, "base must be span-aligned");
assert_eq!(r.len(), span);
unsafe {
for off in (0..initial).step_by(PAGE) {
base.add(off).write(0xAB);
assert_eq!(base.add(off).read(), 0xAB);
}
}
}
#[test]
fn lazy_reserve_then_commit_range_grows_accessible() {
let _guard = serial_guard();
let chunk = 16 * PAGE; let span = 4 * MIB;
let r = reserve_aligned_lazy(span, span, chunk).expect("lazy reserve");
let base = r.as_ptr();
unsafe {
base.write(0x11);
assert_eq!(base.read(), 0x11);
}
let ok = unsafe { commit_range(base, chunk, 2 * chunk) };
assert!(ok, "commit_range must succeed on a live reservation");
unsafe {
base.add(chunk).write(0x22);
assert_eq!(base.add(chunk).read(), 0x22);
}
}
#[test]
fn lazy_reserve_small_align_still_reserves_full_span() {
let _guard = serial_guard();
let ps = page_size();
let align = PAGE; let size = 16 * ps;
let initial = ps; let r = reserve_aligned_lazy(size, align, initial)
.expect("lazy reserve, small align")
.into_reservation();
let base = r.as_ptr();
assert_eq!(r.len(), size, "len() echoes the requested size");
assert!(
r.reservation_len() >= size,
"the OS reservation must cover the full requested span (got {})",
r.reservation_len()
);
unsafe {
base.write(0x33);
assert_eq!(base.read(), 0x33);
}
let ok = unsafe { commit_range(base, initial, size) };
assert!(
ok,
"commit_range beyond initial_commit must succeed even when align <= 64 KiB"
);
unsafe {
base.add(size - PAGE).write(0x44);
assert_eq!(base.add(size - PAGE).read(), 0x44);
}
}
#[test]
fn lazy_reserve_commit_entire_remainder() {
let _guard = serial_guard();
let initial = 16 * PAGE; let span = 2 * MIB;
let r = reserve_aligned_lazy(span, span, initial).expect("lazy reserve 2 MiB");
let base = r.as_ptr();
let ok = unsafe { commit_range(base, initial, span) };
assert!(ok, "commit_range for the full remainder must succeed");
unsafe {
let last_page = span - PAGE;
base.add(last_page).write(0x33);
assert_eq!(base.add(last_page).read(), 0x33);
}
}
#[test]
fn lazy_reservation_validates_against_page_size() {
let _guard = serial_guard();
let ps = page_size();
let span = 4 * MIB;
let valid_initial = 2 * ps; let r = reserve_aligned_lazy(span, span, valid_initial).expect(
"lazy reservation should succeed when size and initial_commit are page_size() multiples",
);
assert_eq!(r.len(), span);
drop(r);
if ps != PAGE {
let bad_size = 17 * PAGE; assert!(
reserve_aligned_lazy(bad_size, bad_size, PAGE).is_none(),
"should reject size not multiple of page_size()"
);
let bad_initial = PAGE; assert!(
reserve_aligned_lazy(span, span, bad_initial).is_none(),
"should reject initial_commit not multiple of page_size()"
);
} else {
let initial = 16 * ps; let r = reserve_aligned_lazy(span, span, initial)
.expect("valid multiples of page_size() should succeed");
assert_eq!(r.len(), span);
drop(r);
}
}
#[test]
fn commit_range_empty_range_is_a_noop() {
let _guard = serial_guard();
let span = 2 * MIB;
let r = reserve_aligned(span, span).expect("reserve");
let base = r.as_ptr();
let ps = page_size();
unsafe {
assert!(commit_range(base, ps, ps), "start==end is a success no-op");
}
}
#[test]
fn commit_range_rejects_contract_violating_offsets() {
let _guard = serial_guard();
let span = 2 * MIB;
let r = reserve_aligned(span, span).expect("reserve");
let base = r.as_ptr();
unsafe {
assert!(
!commit_range(base, 2 * PAGE, PAGE),
"start > end (inverted range) must be rejected, not silently permitted"
);
assert!(
!commit_range(base, 1, PAGE),
"misaligned start must be rejected, not silently permitted"
);
assert!(
!commit_range(base, 0, PAGE + 1),
"misaligned end must be rejected, not silently permitted"
);
assert!(
try_commit_range(base, 1, PAGE)
.unwrap_err()
.is_invalid_argument(),
"the fallible form must carry VmemError::invalid_argument(), not an OS code"
);
}
}
#[test]
fn commit_range_idempotent_on_already_committed() {
let _guard = serial_guard();
let span = 2 * MIB;
let r = reserve_aligned(span, span).expect("reserve");
let base = r.as_ptr();
let ps = page_size();
unsafe {
let ok = commit_range(base, 0, ps);
assert!(ok, "recommitting an already-committed page must succeed");
}
}
#[test]
fn lazy_reserve_rejects_bad_contracts() {
assert!(
reserve_aligned_lazy(4 * MIB, 4 * MIB, 0).is_none(),
"zero initial_commit rejected"
);
assert!(
reserve_aligned_lazy(PAGE, PAGE, 2 * PAGE).is_none(),
"initial_commit > size rejected"
);
assert!(
reserve_aligned_lazy(4 * MIB, 4 * MIB, PAGE + 1).is_none(),
"non-page-multiple initial_commit rejected"
);
assert!(
reserve_aligned_lazy(0, PAGE, PAGE).is_none(),
"zero size rejected"
);
assert!(
reserve_aligned_lazy(PAGE, 3, PAGE).is_none(),
"non-pow2 align rejected"
);
}
#[test]
fn release_via_into_parts_after_partial_commit() {
let _guard = serial_guard();
let initial = 16 * PAGE; let span = 4 * MIB;
let r = reserve_aligned_lazy(span, span, initial)
.expect("lazy reserve")
.into_reservation();
let base = r.as_ptr();
unsafe {
base.write(0xCC);
}
let (raw, raw_len, raw_align) = r.into_parts();
assert!(!raw.is_null());
unsafe { aligned_vmem::release(raw, raw_len, raw_align) };
}
#[test]
fn lazy_reserve_full_commit_equals_eager() {
let _guard = serial_guard();
let span = 2 * MIB;
let r_lazy =
reserve_aligned_lazy(span, span, span).expect("lazy reserve with full initial commit");
let r_eager = reserve_aligned(span, span).expect("eager reserve");
assert_eq!(r_lazy.len(), span);
assert_eq!(r_eager.len(), span);
assert_eq!(r_lazy.as_ptr() as usize % span, 0);
assert_eq!(r_eager.as_ptr() as usize % span, 0);
unsafe {
let off = span - PAGE;
r_lazy.as_ptr().add(off).write(0xDD);
r_eager.as_ptr().add(off).write(0xEE);
assert_eq!(r_lazy.as_ptr().add(off).read(), 0xDD);
assert_eq!(r_eager.as_ptr().add(off).read(), 0xEE);
}
}
#[test]
fn sequential_commit_range_grows_incrementally() {
let _guard = serial_guard();
let chunk = 16 * PAGE; let span = 2 * MIB;
let r = reserve_aligned_lazy(span, span, chunk).expect("lazy reserve");
let base = r.as_ptr();
let mut frontier = chunk;
for step in 0..5 {
let new_frontier = frontier + chunk;
if new_frontier > span {
break;
}
let ok = unsafe { commit_range(base, frontier, new_frontier) };
assert!(
ok,
"commit_range step {} must succeed (frontier {} -> {})",
step, frontier, new_frontier
);
unsafe {
base.add(frontier).write((step as u8) + 1);
assert_eq!(base.add(frontier).read(), (step as u8) + 1);
}
frontier = new_frontier;
}
unsafe {
#[cfg(not(miri))]
assert_eq!(base.read(), 0, "initial region byte not overwritten");
for step in 0..5u8 {
let off = chunk + (step as usize) * chunk;
if off >= frontier {
break;
}
assert_eq!(
base.add(off).read(),
step + 1,
"step {} value mismatch",
step
);
}
}
}
#[test]
#[cfg(all(
windows,
feature = "bench-internals",
not(aligned_vmem_mock),
not(miri)
))]
fn windows_lazy_reserve_saves_commit_charge() {
let _guard = serial_guard();
let span = 4 * MIB;
let align = PAGE;
let initial = PAGE;
aligned_vmem::reset_bench_internals_counters();
let before_two_call = aligned_vmem::windows_reserve_commit_two_call_pairs();
let before_single_call = aligned_vmem::windows_reserve_commit_single_calls();
let r = reserve_aligned_lazy(span, align, initial).expect("lazy reserve");
let after_two_call = aligned_vmem::windows_reserve_commit_two_call_pairs();
let after_single_call = aligned_vmem::windows_reserve_commit_single_calls();
assert_eq!(
after_two_call,
before_two_call + 1,
"reserve_aligned_lazy with small initial_commit must take the two-call path"
);
assert_eq!(
after_single_call, before_single_call,
"reserve_aligned_lazy with small initial_commit must NOT take the single-call path"
);
let base = r.as_ptr();
unsafe {
base.write(0xAA);
assert_eq!(base.read(), 0xAA);
}
}
#[test]
fn safe_decommit_over_never_committed_tail_succeeds() {
let _guard = serial_guard();
let initial = 16 * PAGE; let span = 4 * MIB;
let mut r = reserve_aligned_lazy(span, span, initial)
.expect("lazy reserve")
.into_reservation();
let base = r.as_ptr();
unsafe {
base.write(0x55);
assert_eq!(base.read(), 0x55);
}
#[cfg(all(
windows,
feature = "bench-internals",
not(aligned_vmem_mock),
not(miri)
))]
let (failures_before, attempts_before) = (
aligned_vmem::windows_virtualfree_decommit_failures(),
aligned_vmem::windows_virtualfree_decommit_attempts(),
);
let decommit_start = initial;
let decommit_end = 2 * initial;
r.decommit(decommit_start, decommit_end);
#[cfg(not(windows))]
unsafe {
assert_eq!(
base.read(),
0x55,
"decommitted region still readable on Unix"
);
}
#[cfg(windows)]
{
#[cfg(all(
windows,
feature = "bench-internals",
not(aligned_vmem_mock),
not(miri)
))]
{
let attempts_after = aligned_vmem::windows_virtualfree_decommit_attempts();
let failures_after = aligned_vmem::windows_virtualfree_decommit_failures();
assert_eq!(
attempts_after,
attempts_before + 1,
"VirtualFree(MEM_DECOMMIT) should be attempted exactly once"
);
assert_eq!(
failures_after, failures_before,
"VirtualFree(MEM_DECOMMIT) should not fail on never-committed pages"
);
}
}
}
#[test]
#[cfg(all(windows, feature = "bench-internals", not(aligned_vmem_mock)))]
fn windows_virtualfree_release_failures_accessor_exists() {
let _guard = serial_guard();
aligned_vmem::reset_bench_internals_counters();
let failures = aligned_vmem::windows_virtualfree_release_failures();
assert_eq!(
failures, 0,
"windows_virtualfree_release_failures() should return 0 after reset"
);
}