mod cold;
use super::page::{try_allocate_page_local, try_reclaim_and_allocate};
use crate::local_alloc::ThreadAllocator;
use mnemosyne_arena::HasSegmentPool;
use mnemosyne_core::policy::AllocPolicy;
#[cfg(test)]
use mnemosyne_core::size_class::size_to_class;
impl<B: HasSegmentPool> ThreadAllocator<B> {
#[inline(always)]
pub unsafe fn alloc_class<P: AllocPolicy>(&mut self, class: usize) -> *mut u8 {
if let Some(page_ptr) = unsafe { *self.active_pages.get_unchecked(class) } {
let page = page_ptr.as_ptr();
if let Some(block) = unsafe { try_allocate_page_local::<P>(page) } {
return block.as_ptr() as *mut u8;
}
if let Some(block) =
unsafe { try_reclaim_and_allocate::<P>(page, &mut self.cross_thread_reclaimed) }
{
return block.as_ptr() as *mut u8;
}
}
unsafe { self.alloc_cold::<P>(class) }
}
#[cfg(test)]
#[inline(always)]
pub unsafe fn alloc<P: AllocPolicy>(&mut self, size: usize) -> *mut u8 {
let class = match size_to_class(size) {
Some(c) => c,
None => return core::ptr::null_mut(),
};
unsafe { self.alloc_class::<P>(class) }
}
}