pub mod bump_allocator;
pub mod pointer_offset;
pub mod pool_allocator;
use core::{alloc::Layout, fmt::Debug, ptr::NonNull};
use iceoryx2_bb_elementary::enum_gen;
pub use iceoryx2_bb_elementary_traits::allocator::AllocationError;
use iceoryx2_bb_elementary_traits::allocator::BaseAllocator;
pub use pointer_offset::*;
use serde::{Deserialize, Serialize};
pub trait ShmAllocatorConfig: Copy + Default + Debug + Send {}
enum_gen! {
ShmAllocationError
entry:
ExceedsMaxSupportedAlignment
mapping:
AllocationError
}
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default, Serialize, Deserialize)]
pub enum AllocationStrategy {
BestFit,
PowerOfTwo,
#[default]
Static,
}
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub enum ShmAllocatorInitError {
MaxSupportedMemoryAlignmentInsufficient,
AllocationFailed,
}
impl core::fmt::Display for ShmAllocatorInitError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "ShmAllocatorInitError::{self:?}")
}
}
impl core::error::Error for ShmAllocatorInitError {}
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);
}