pub mod bump_allocator;
pub mod pointer_offset;
pub mod pool_allocator;
use core::{alloc::Layout, fmt::Debug, ptr::NonNull};
pub use iceoryx2_bb_elementary::allocator::AllocationError;
use iceoryx2_bb_elementary::{allocator::BaseAllocator, enum_gen};
pub use pointer_offset::*;
pub trait ShmAllocatorConfig: Copy + Default + Debug {}
enum_gen! {
ShmAllocationError
entry:
ExceedsMaxSupportedAlignment
mapping:
AllocationError
}
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
pub enum AllocationStrategy {
BestFit,
PowerOfTwo,
#[default]
Static,
}
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub enum ShmAllocatorInitError {
MaxSupportedMemoryAlignmentInsufficient,
AllocationFailed,
}
pub struct SharedMemorySetupHint<Config: ShmAllocatorConfig> {
pub payload_size: usize,
pub config: Config,
}
pub trait ShmAllocator: Debug + Send + Sync + 'static {
type Configuration: ShmAllocatorConfig;
fn resize_hint(
&self,
layout: Layout,
strategy: AllocationStrategy,
) -> SharedMemorySetupHint<Self::Configuration>;
fn initial_setup_hint(
max_chunk_layout: Layout,
max_number_of_chunks: usize,
) -> SharedMemorySetupHint<Self::Configuration>;
fn management_size(memory_size: usize, config: &Self::Configuration) -> usize;
unsafe fn new_uninit(
max_supported_alignment_by_memory: usize,
managed_memory: NonNull<[u8]>,
config: &Self::Configuration,
) -> Self;
unsafe fn init<Allocator: BaseAllocator>(
&mut self,
mgmt_allocator: &Allocator,
) -> Result<(), ShmAllocatorInitError>;
fn unique_id() -> u8;
fn max_alignment(&self) -> usize;
fn relative_start_address(&self) -> usize;
unsafe fn allocate(&self, layout: Layout) -> Result<PointerOffset, ShmAllocationError>;
unsafe fn deallocate(&self, distance: PointerOffset, layout: Layout);
}