use crate::math::align;
use iceoryx2_bb_concurrency::atomic::AtomicUsize;
use iceoryx2_bb_concurrency::atomic::Ordering;
use iceoryx2_bb_elementary_traits::allocator::{AllocationError, BaseAllocator};
pub struct BumpAllocator {
start: *mut u8,
pos: AtomicUsize,
}
impl BumpAllocator {
pub fn new(start: *mut u8) -> Self {
Self {
start,
pos: AtomicUsize::new(start as usize),
}
}
}
impl BaseAllocator for BumpAllocator {
fn allocate(
&self,
layout: core::alloc::Layout,
) -> Result<core::ptr::NonNull<[u8]>, AllocationError> {
let mem = align(self.pos.load(Ordering::Relaxed), layout.align());
self.pos.store(mem + layout.size(), Ordering::Relaxed);
unsafe {
Ok(core::ptr::NonNull::new_unchecked(
core::ptr::slice_from_raw_parts_mut(
self.start.add(mem - self.start as usize),
layout.size(),
),
))
}
}
unsafe fn deallocate(&self, _ptr: core::ptr::NonNull<u8>, _layout: core::alloc::Layout) {
self.pos.store(self.start as usize, Ordering::Relaxed);
}
}