#[doc(hidden)]
pub unsafe fn miri_cleanup_pools<B: mnemosyne_arena::HasSegmentPool>() {
let mut orphaned = std::vec::Vec::new();
while let Some(segment) = B::global_orphan_pool().pop() {
orphaned.push(segment);
}
for segment in orphaned {
let encrypted = unsafe { (*segment).free_list_encrypted };
for page_index in
mnemosyne_core::types::OccupiedPageBits::new(unsafe { (*segment).page_occupied_mask })
{
unsafe {
let randomized = (*segment).pages[page_index].secondary_free.is_some();
mnemosyne_core::types::Page::reclaim_thread_free_if_present_in_segment_with_randomized(
segment,
page_index,
encrypted,
randomized,
);
}
}
if unsafe {
(*segment)
.pages
.iter()
.skip(1)
.any(|page| page.alloc_count != 0)
} {
unsafe { B::global_orphan_pool().push_unbounded(segment) };
} else {
unsafe { mnemosyne_arena::deallocate_segment::<B>(segment) };
}
}
unsafe { mnemosyne_arena::purge_segment_pool::<B>() };
}