use rusty_alloc::alloc::{free, malloc, stats};
const ROUND: usize = 20_000;
const ROUNDS: usize = 6;
#[test]
fn cycling_rounds_should_not_carve_fresh_pages_every_round() {
let mut live: Vec<*mut u8> = Vec::with_capacity(ROUND);
let mut prev_fresh = 0u64;
let mut prev_segments = 0u64;
println!(
"{:>5} {:>12} {:>12} {:>12} {:>10}",
"round", "pages_fresh", "d_fresh", "d_segments", "retired"
);
for r in 0..ROUNDS {
for i in 0..ROUND {
let n = 16 + ((i * 37) % 3000);
let p = malloc(n);
assert!(!p.is_null(), "round {r}: malloc failed");
unsafe { core::ptr::write_bytes(p, 0xA5, n) };
live.push(p);
}
for p in live.drain(..) {
unsafe { free(p) };
}
let s = stats();
println!(
"{r:>5} {:>12} {:>12} {:>12} {:>10}",
s.pages_fresh,
s.pages_fresh - prev_fresh,
s.segments - prev_segments,
s.pages_retired
);
prev_fresh = s.pages_fresh;
prev_segments = s.segments;
}
let s = stats();
println!(
"\ntotals: segments={} pages_fresh={} pages_retired={} purges={} segments_freed={}",
s.segments, s.pages_fresh, s.pages_retired, s.purges, s.segments_freed
);
println!(
"\nIf `d_fresh` stays high after round 0, spans are being re-carved \
rather than reused - that is the RSS gap."
);
}