Skip to main content

InMemorySlotAllocator

Struct InMemorySlotAllocator 

Source
pub struct InMemorySlotAllocator { /* private fields */ }
Expand description

In-memory slot allocator. Provides the same SlotBackend interface as the POSIX mmap backend (posix.rs), but lives on the process heap — single-process pub/sub and test setups without an mmap dep.

Implementations§

Source§

impl InMemorySlotAllocator

Source

pub fn new(segment_id: u64, slot_count: usize, slot_capacity: usize) -> Self

Creates a new allocator with slot_count slots, each with a slot_capacity-byte data area.

Source

pub fn notify_gen(&self) -> u64

Current notify generation. Capture it before checking a condition and pass it to Self::wait_for_change to avoid a lost wakeup.

Source

pub fn wait_for_change(&self, last: u64, timeout: Duration)

Blocks until the notify generation differs from last or timeout elapses (event-driven, Spec §4.2 — no busy-poll). Pair with Self::notify_gen for lost-wakeup-free waiting.

Source

pub fn with_type_hash(self, hash: [u8; 16]) -> Self

Spec §6.1: allocator with an associated type-hash. A reader reading against this backend checks the hash against T::TYPE_HASH and drops on mismatch.

Source

pub fn reserve_slot( &self, active_readers_mask: ReaderMask, ) -> Result<SlotHandle, SlotError>

Spec §4.1 reserve_slot. Finds a free slot (all active readers have read) or the first unused one.

§Errors

NoFreeSlot when all slots are loaned or unfinished.

Source

pub fn commit_slot( &self, handle: SlotHandle, bytes: &[u8], ) -> Result<u32, SlotError>

Spec §4.1 commit_slot. Writes the sample bytes into the slot and sets SlotHeader { sn, sample_size, reader_mask=0 }.

§Errors

OutOfBounds, SampleTooLarge, or lock poison.

Source

pub fn slot_data_ptr( &self, handle: SlotHandle, ) -> Result<(*mut u8, usize), SlotError>

In-place loan: writable pointer + capacity into a reserved slot’s data area (see SlotBackend::slot_data_ptr).

§Errors

OutOfBounds if the slot is not a live loan, or lock poison.

Source

pub fn commit_in_place( &self, handle: SlotHandle, len: usize, ) -> Result<u32, SlotError>

Finalizes an in-place loan (no copy) — sets the header + releases the loan (see SlotBackend::commit_in_place).

§Errors

SampleTooLarge, OutOfBounds, or lock poison.

Source

pub fn slot_read_ptr( &self, handle: SlotHandle, ) -> Result<(*const u8, usize), SlotError>

Zero-copy read pointer + sample length into a committed slot (see SlotBackend::slot_read_ptr).

§Errors

OutOfBounds or lock poison.

Source

pub fn next_unread_slot( &self, reader_index: u8, ) -> Result<Option<SlotHandle>, SlotError>

Next committed slot not yet read by reader_index (see SlotBackend::next_unread_slot).

§Errors

Lock poison.

Source

pub fn evict_stale( &self, max_age: Duration, active_readers_mask: ReaderMask, ) -> Result<usize, SlotError>

Spec §5.1 timeout-eviction. Force-frees every committed, not-yet-fully- read, not-currently-loaned slot whose sample was committed more than max_age ago — by setting all active_readers_mask bits so the slot counts as read and becomes reservable again. Guards against a single hung/dead reader holding a slot hostage forever (the SPDP lease path handles clean disconnects; this is the backstop for a stuck-but-alive reader). Returns the number of slots evicted. The writer side calls this periodically (e.g. from the DCPS tick).

§Errors

Lock poison.

Source

pub fn discard_slot(&self, handle: SlotHandle) -> Result<(), SlotError>

Spec §4.1 release_slot (no commit; discards the loan).

§Errors

OutOfBounds or lock poison.

Source

pub fn read_slot( &self, handle: SlotHandle, ) -> Result<(SlotHeader, Vec<u8>), SlotError>

Reader side: reads slot header + bytes.

§Errors

OutOfBounds.

Source

pub fn mark_read( &self, handle: SlotHandle, reader_index: u8, ) -> Result<(), SlotError>

Reader side: sets the reader_index bit in reader_mask.

§Errors

OutOfBounds or lock poison.

Source

pub fn mark_reader_disconnected( &self, reader_index: u8, ) -> Result<(), SlotError>

Spec §5.2 reader disconnect, applied retroactively.

Called by the caller (SPDP lease-expiry hook) when a reader has died. Sets its bit on all slots, so that the slot allocator sees it as “has read” and frees up occupied slots again.

§Errors

Lock poison.

Source

pub fn slot_capacity(&self) -> usize

Slot capacity (data area; without header).

Source

pub fn slot_count(&self) -> Result<usize, SlotError>

Number of configured slots.

Source

pub fn slot_total_size(&self) -> usize

Computes the total slot size (header + data, padded to a 64-byte cache line) — for SEDP discovery.

Trait Implementations§

Source§

impl SlotBackend for InMemorySlotAllocator

Available on crate feature std only.
Source§

fn reserve_slot( &self, active_readers_mask: ReaderMask, ) -> Result<SlotHandle, SlotError>

Reserves a free slot. The caller then writes via commit_slot and thereby publishes the sample. Read more
Source§

fn commit_slot( &self, handle: SlotHandle, bytes: &[u8], ) -> Result<u32, SlotError>

Writes the sample bytes into the slot and sets SlotHeader { sn, sample_size, reader_mask=0 }. Returns the SN. Read more
Source§

fn discard_slot(&self, handle: SlotHandle) -> Result<(), SlotError>

Discards a loan without committing. The slot becomes free again. Read more
Source§

fn slot_data_ptr( &self, handle: SlotHandle, ) -> Result<(*mut u8, usize), SlotError>

True zero-copy loan: returns a writable pointer + capacity into a currently reserved slot’s data region, so the caller can fill the sample in place (no staging copy) and then call Self::commit_in_place. The pointer is valid until that commit_in_place or a discard_slot for the same handle; the slot must have been obtained from Self::reserve_slot and not yet committed/discarded. Read more
Source§

fn commit_in_place( &self, handle: SlotHandle, len: usize, ) -> Result<u32, SlotError>

Finalizes a slot whose len data bytes were already written in place via Self::slot_data_ptr — sets SlotHeader { sn, sample_size=len, reader_mask=0 } and releases the loan, with no data copy. Returns the SN. The byte-for-byte result is identical to commit_slot(handle, &buf[..len]), only without the staging copy. Read more
Source§

fn slot_read_ptr( &self, handle: SlotHandle, ) -> Result<(*const u8, usize), SlotError>

Zero-copy read: returns a read-only pointer + sample length into a committed slot’s data region — the reader consumes in place without a copy (counterpart to Self::read_slot, which copies). The pointer is valid until the slot is recycled (i.e. until every active reader has mark_read it and the writer reserves it again); a same-host reader reads it, then calls Self::mark_read. Default: InPlaceUnsupported. Read more
Source§

fn next_unread_slot( &self, reader_index: u8, ) -> Result<Option<SlotHandle>, SlotError>

Reader-side scan: returns the handle of the next committed slot (sample_size > 0) that reader_index has not yet mark_read. Used with Self::slot_read_ptr for an untyped zero-copy take, then Self::mark_read to release it. Returns Ok(None) when nothing new is pending. Default: Ok(None). Read more
Source§

fn read_slot( &self, handle: SlotHandle, ) -> Result<(SlotHeader, Vec<u8>), SlotError>

Reads slot header + data bytes (copied). Read more
Source§

fn mark_read( &self, handle: SlotHandle, reader_index: u8, ) -> Result<(), SlotError>

Sets the reader_index bit in the slot’s reader_mask (reader has read). Read more
Source§

fn mark_reader_disconnected(&self, reader_index: u8) -> Result<(), SlotError>

Sets the reader_index bit retroactively on all slots (SPDP lease-expiry). Read more
Source§

fn slot_count(&self) -> Result<usize, SlotError>

Number of configured slots. Read more
Source§

fn slot_total_size(&self) -> usize

Total slot size (header + data + padding); for discovery.
Source§

fn slot_capacity(&self) -> usize

Data area per slot (without header, without padding).
Source§

fn type_hash(&self) -> Option<[u8; 16]>

Spec §6.1: TYPE_HASH of the topic type, if known to the backend. None = the backend tracks no hash; the caller must verify another way (e.g. via discovery). Default: None.
Source§

fn notify_generation(&self) -> u64

Spec §4.2 event-driven notify — current change generation. Bumped on every commit_slot (new sample → wake readers) and slot-free (mark_read/discard_slot/… → wake writers). Capture this before checking a condition and pass it to Self::wait_for_change for a lost-wakeup-free wait. Default 0 for backends without notify support.
Source§

fn wait_for_change(&self, last: u64, timeout: Duration)

Spec §4.2 — blocks until the change generation differs from last or timeout elapses (event-driven, NO busy-poll). Default: returns immediately (a backend without notify support degrades to caller-driven polling). InMemorySlotAllocator uses a Condvar; PosixSlotAllocator uses a cross-process futex on a shared-memory word (Linux).

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V