pub mod bump_allocator;
pub mod pool_allocator;
use std::{alloc::Layout, ptr::NonNull};
pub use iceoryx2_bb_elementary::allocator::AllocationError;
use iceoryx2_bb_elementary::{
allocator::{BaseAllocator, DeallocationError},
enum_gen,
};
pub trait ShmAllocatorConfig: Copy + Default {}
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub struct PointerOffset(usize);
impl PointerOffset {
pub fn new(value: usize) -> PointerOffset {
Self(value)
}
pub fn value(&self) -> usize {
self.0
}
}
enum_gen! { ShmAllocationError
entry:
ExceedsMaxSupportedAlignment
mapping:
AllocationError
}
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub enum ShmAllocatorInitError {
MaxSupportedMemoryAlignmentInsufficient,
AllocationFailed,
}
pub trait ShmAllocator: Send + Sync + 'static {
type Configuration: ShmAllocatorConfig;
fn management_size(memory_size: usize, config: &Self::Configuration) -> usize;
unsafe fn new_uninit(
max_supported_alignment_by_memory: usize,
base_address: NonNull<[u8]>,
config: &Self::Configuration,
) -> Self;
unsafe fn init<Allocator: BaseAllocator>(
&self,
allocator: &Allocator,
) -> Result<(), ShmAllocatorInitError>;
fn unique_id() -> u8;
fn max_alignment(&self) -> usize;
unsafe fn allocate(&self, layout: Layout) -> Result<PointerOffset, ShmAllocationError>;
unsafe fn deallocate(
&self,
distance: PointerOffset,
layout: Layout,
) -> Result<(), DeallocationError>;
}