hibana 0.9.6

Choreography-derived runtime enforcement kernel for no_std Rust multiparty protocols
Documentation
use super::{Rendezvous, Transport};
use crate::session::cluster::error::ResourceScope;

pub(in crate::rendezvous::core) fn endpoint_offset_in_gap(
    base: usize,
    gap_start: usize,
    gap_end: usize,
    bytes: usize,
    align: usize,
) -> Option<usize> {
    if !align.is_power_of_two() {
        crate::invariant();
    }
    let unaligned = base.checked_add(gap_end.checked_sub(bytes)?)?;
    let offset = (unaligned & !(align - 1)).checked_sub(base)?;
    if offset < gap_start {
        return None;
    }
    Some(offset)
}

impl<'rv, 'cfg, T: Transport> Rendezvous<'rv, 'cfg, T>
where
    'cfg: 'rv,
{
    pub(super) fn plan_endpoint_lease_offset(
        &self,
        bytes: usize,
        align: usize,
        floor: usize,
    ) -> Result<usize, ResourceScope> {
        let (slab_ptr, slab_len) = self.slab_ptr_and_len();
        let base = slab_ptr as usize;
        let slot_count = self.endpoint_lease_slot_count();
        let mut candidate_end = slab_len;
        loop {
            let mut best_idx = None;
            let mut best_offset = 0usize;
            let mut idx = 0usize;
            while idx < slot_count {
                let slot = crate::invariant_some(self.endpoint_lease_slot_by_index(idx));
                let offset = slot.offset as usize;
                if slot.is_occupied() && offset < candidate_end && offset >= best_offset {
                    best_offset = offset;
                    best_idx = Some(idx);
                }
                idx += 1;
            }
            let gap_start = match best_idx {
                Some(idx) => {
                    let slot = crate::invariant_some(self.endpoint_lease_slot_by_index(idx));
                    crate::invariant_some((slot.offset as usize).checked_add(slot.len as usize))
                }
                None => floor,
            };
            if let Some(offset) =
                endpoint_offset_in_gap(base, gap_start, candidate_end, bytes, align)
                && offset >= floor
            {
                return Ok(offset);
            }
            let Some(idx) = best_idx else {
                return Err(ResourceScope::EndpointLease);
            };
            candidate_end =
                crate::invariant_some(self.endpoint_lease_slot_by_index(idx)).offset as usize;
        }
    }
}