o3 0.36.2

shared-nothing primitives
Documentation
pub mod common;

#[global_allocator]
static ALLOCATOR: Tracker = Tracker;

use std::{mem, num, pin::Pin};

use common::{alloc::system::Tracker, buffer::domain::Capacity};
use o3::{
    base::cell::region,
    buffer::{
        Residency as _,
        hold::{
            self,
            scope::{self, Input},
        },
        pool::{self, state},
        resident::{self, staging},
        storage,
        write::{Sink as _, SpareExt as _},
    },
};

#[test]
fn slices_use_one_alloc() {
    Capacity(6)
        .try_scope(|budget| {
            let (exact, allocs) = Tracker::measure(|| {
                resident::Exact::try_slices(&budget, [&b"pre"[..], &[], b"tag"])
            });
            let exact = exact.expect("six-byte resident owner");
            assert_eq!((allocs[0], allocs[2]), (1, 0));
            assert_eq!(exact.as_slice(), b"pretag");
            assert_eq!(exact.bytes(), 6);
            let exact = {
                let clone = exact.try_clone().expect("second exact edge");
                drop(exact);
                clone
            };
            let clone = {
                let shared = exact.into_shared();
                shared.try_clone().expect("second edge")
            };
            assert_eq!(budget.resident(), 6);
            let ((), freed) = Tracker::measure(move || assert_eq!(clone.as_slice(), b"pretag"));
            assert_eq!(freed, [0, 0, 1, allocs[1]]);
            assert_eq!(budget.resident(), 0);
        })
        .expect("resident domain");
}

#[test]
fn detaches_borrowed_pool() {
    let pool = (pool::Pool::<state::Uninit>::try_new(1, 16)).expect("fixture pool must allocate");
    let mut cursor = (pool.view()).expect("the only pool slot is vacant");
    {
        let mut spare = cursor.spare();
        assert_eq!(spare.write(b"borrowed"), b"borrowed".len());
        spare.commit();
    }
    let pointer = cursor.as_ref().as_ptr();
    let scoped = resident::Shared::from(cursor.freeze());

    let (detached, count) = Tracker::count(|| scoped.try_detach());
    match detached {
        Ok(shared) => {
            {
                let shared = shared;
                assert_eq!(count, 0);
                assert_eq!(shared.as_slice().as_ptr(), pointer);
                assert_eq!(shared.as_slice(), b"borrowed");
                assert_eq!(pool.available(), 0);
            }
            assert_eq!(pool.available(), 1);
        }
        outcome => {
            assert!(
                outcome.is_ok(),
                "plain pool ownership must detach without allocation"
            );
        }
    }
}

#[test]
fn transfers_unique() {
    let (owner, built) = Tracker::measure(|| {
        Capacity(8)
            .try_scope(|budget| {
                let mut owner = storage::Owned::try_allocate(&budget, 8).expect("resident owner");
                let mut spare = owner.spare();
                spare.write_slice(b"body").expect("initialized prefix");
                spare.commit();
                let owner = owner.freeze().project(1..3).expect("projected extent");
                let pointer = owner.as_ptr();
                let sibling = owner.try_clone().expect("shared edge");
                let (owner, activity) = Tracker::measure(|| owner.try_owned());
                let owner = owner.expect_err("a shared resident stays bound");
                assert_eq!(activity, [0; 4]);
                assert_eq!(budget.resident(), 8);
                assert_eq!(owner.as_ptr(), pointer);
                drop(sibling);
                let (owner, activity) = Tracker::measure(|| owner.try_owned());
                let owner = owner.expect("sole resident transfers");
                assert_eq!(activity, [0; 4]);
                assert_eq!(budget.resident(), 0);
                assert_eq!(owner.as_ptr(), pointer);
                assert_eq!(owner.as_slice(), b"od");
                owner
            })
            .expect("resident domain")
    });
    assert_eq!((built[0], built[2]), (1, 0));
    let sibling = owner.try_clone().expect("independent shared edge");
    drop(owner);
    assert_eq!(sibling.as_slice(), b"od");
    let ((), freed) = Tracker::measure(|| drop(sibling));
    assert_eq!(freed, [0, 0, 1, built[1]]);
}

#[test]
fn retains_independent_view() {
    let pool = pool::Pool::<state::Uninit>::try_new(1, 16).expect("pool");
    let mut cursor = pool.view().expect("slot");
    {
        let mut spare = cursor.spare();
        spare.write(b"borrowed");
        spare.commit();
    }
    let source = resident::Shared::from(cursor.freeze());
    let view = source.get(1..4).expect("range");
    let pointer = view.as_slice().as_ptr();
    let (retained, allocs) = Tracker::count(|| view.try_own());
    let retained = retained.expect("retain").expect("independent");
    drop(source);
    assert_eq!(allocs, 0);
    assert_eq!(retained.as_slice().as_ptr(), pointer);
    assert_eq!(retained.as_slice(), b"orr");
    assert_eq!(pool.available(), 0);
    drop(retained);
    assert_eq!(pool.available(), 1);

    let bytes = [1, 2];
    let scoped = resident::Shared::from(bytes.as_slice());
    assert!(
        scoped
            .get(0..1)
            .expect("range")
            .try_own()
            .expect("scope")
            .is_none()
    );
    assert!(
        scoped
            .get(0..0)
            .expect("empty")
            .try_own()
            .expect("empty")
            .expect("independent")
            .is_empty()
    );
}

#[test]
fn rejects_resident_pool() {
    Capacity(24)
        .try_scope(|budget| {
            let planned =
                staging::Plan::new(8, 8).and_then(|plan| staging::Layout::new(1, plan, 1, 0));
            let layout = (planned).expect("valid staging capacity");

            let pool = (staging::Pool::try_new(&budget, layout))
                .expect("the ownership staging pool must allocate");
            let mut window =
                (staging::Buf::try_from(&pool)).expect("the receive owner must be retained");
            window
                .write_slice(b"resident")
                .as_ref()
                .expect("fixture payload must fit");
            let pointer = window.as_slice().as_ptr();
            let shared = scope::Input::new(&window, &budget)
                .defer_all()
                .bind(hold::Policy::share())
                .try_into();
            let shared = (shared).expect("the received bytes must retain their accounted owner");

            let (detached, count) = Tracker::count(|| shared.try_detach());
            assert_eq!(count, 0);
            assert!(
                detached.is_err(),
                "resident ownership must reject zero-copy detachment"
            );
            let Err(shared) = detached else {
                return;
            };
            let (result, count) = Tracker::count(|| storage::Shared::try_copy(shared.as_slice()));
            let escaped = result.expect("resident bytes must copy into plain storage");

            assert_eq!(count, 1);
            assert_ne!(escaped.as_slice().as_ptr(), pointer);
            assert_eq!(escaped.as_slice(), b"resident");
        })
        .expect("resident test domain must admit its budget");
}

#[test]
fn rejects_reuse() {
    let mut domain = resident::Domain::new();
    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = (domain.try_budget(8, token.proof()))
            .expect("a fresh domain must admit its first generation");
        let charge = (budget.try_charge(8)).expect("the exact budget must be available");
        mem::forget(charge);
    });
    for capacity in [0, 4, 16] {
        region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
            let domain = domain.get_mut();
            let result = domain.try_budget(capacity, token.proof());
            let cause = result.expect_err("a forgotten charge must prevent domain reuse");
            assert_eq!(
                cause,
                resident::Reuse {
                    retained: num::NonZero::<usize>::MIN.saturating_add(7),
                    previous: 8,
                    requested: capacity,
                }
            );
        });
    }
}

#[test]
fn rejects_growth() {
    let mut domain = resident::Domain::new();
    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = (domain.try_budget(10, token.proof()))
            .expect("a fresh domain must admit its first generation");
        {
            let mut first = (budget.try_charge(7)).expect("seven bytes must fit");
            {
                let second = (budget.try_charge(3)).expect("the remaining three bytes must fit");
                assert_eq!(second.capacity(), 3);
                let result = first.try_resize(8);
                let error = result.expect_err("an additional byte must exceed the full budget");
                assert_eq!(error.into_parts(), (num::NonZero::<usize>::MIN, 0));
                assert_eq!((first.capacity(), budget.resident()), (7, 10));
            }
            assert_eq!(first.try_resize(9), Ok(()));
            assert_eq!((first.capacity(), budget.available()), (9, 1));
        }
        assert_eq!(budget.resident(), 0);
    });
    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = (domain.try_budget(0, token.proof()))
            .expect("released credit must permit a new empty generation");
        assert_eq!((budget.capacity(), budget.resident()), (0, 0));
    });
}

#[test]
fn admits_full_width() {
    let mut domain = resident::Domain::new();
    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = (domain.try_budget(usize::MAX, token.proof()))
            .expect("a fresh domain must accept the full usize limit");
        assert_eq!(budget.charge().capacity(), 0);
        assert_eq!(budget.resident(), 0);
        {
            let mut charge = (budget.try_charge(usize::MAX))
                .expect("the full limit must be chargeable without overflow");
            assert_eq!(budget.available(), 0);
            let empty = (budget.try_charge(0)).expect("a zero charge must require no capacity");
            assert_eq!(empty.capacity(), 0);
            let result = budget.try_charge(1);
            let error = result
                .err()
                .expect("a full budget must reject an additional byte");
            assert_eq!(error.into_parts(), (num::NonZero::<usize>::MIN, 0));
            assert_eq!(charge.try_resize(1), Ok(()));
            assert_eq!(budget.available(), usize::MAX - 1);
        }
        assert_eq!(budget.resident(), 0);
    });
}

#[test]
fn tracks_resident_owner() {
    let mut domain = resident::Domain::new();
    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = domain.try_budget(4, token.proof());
        let budget = budget.expect("asserted empty resident domain");
        let result = storage::Owned::try_allocate(&budget, 4);
        let mut bytes = result.expect("four resident bytes must fit their budget");
        let ptr = bytes.as_ptr();
        let mut spare = bytes.spare();
        spare
            .write_slice(b"data")
            .as_ref()
            .expect("required fixture outcome");
        spare.commit();
        {
            let clone = {
                let shared = bytes.freeze();
                let clone = shared.try_clone().expect("asserted retained edge");
                assert_eq!(shared.as_ptr(), ptr);
                assert_eq!(clone.as_ptr(), ptr);
                assert_eq!(budget.resident(), 4);
                let Err(resident::AllocError::Budget(error)) =
                    storage::Owned::try_allocate(&budget, 1)
                else {
                    panic!("allocation beyond the budget must fail at admission");
                };
                assert_eq!(error.into_parts(), (num::NonZero::<usize>::MIN, 0));
                clone
            };
            assert_eq!(clone.as_ptr(), ptr);
            assert_eq!(budget.resident(), 4);
        }
        assert_eq!(budget.resident(), 0);
    });
}

#[test]
fn response_retains_source() {
    use o3::buffer::hold;

    for account in [false, true] {
        for capacity in [4, 8] {
            Capacity(64)
                .try_scope(|budget| {
                    {
                        let (retained, pointer) = {
                            let plan = (staging::Plan::new(4, 8)).expect("valid staging capacity");

                            let layout = (staging::Layout::new(1, plan, 1, 8))
                                .expect("valid staging capacity");

                            let pool = if account {
                                staging::Pool::try_account(&budget, layout)
                            } else {
                                staging::Pool::try_new(&budget, layout)
                            }
                            .expect("response staging pool");
                            let mut source =
                                staging::Buf::try_from(&pool).expect("response staging buffer");
                            source.try_reserve(capacity).expect("warm or grown backing");
                            source.write_slice(b"body").expect("complete response");
                            let pointer = source.as_slice().as_ptr();
                            let (retained, activity) = Tracker::measure(|| {
                                Input::new(&source, &budget)
                                    .defer_all()
                                    .bind(hold::Policy::share())
                                    .try_into()
                            });
                            let retained = retained.expect("retain exact response source");
                            assert_eq!(activity, [0; 4]);
                            assert_eq!(retained.as_slice().as_ptr(), pointer);
                            source.clear();
                            (retained, pointer)
                        };
                        assert_eq!(retained.as_slice(), b"body");
                        assert_eq!(retained.as_slice().as_ptr(), pointer);
                        assert_eq!(retained.resident(), capacity);
                    }
                    assert_eq!(budget.resident(), 0);
                })
                .expect("resident test domain must admit its budget");
        }
    }
}

#[test]
fn reuses_resident_domain() {
    let mut domain = resident::Domain::new();

    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = domain.try_budget(8, token.proof());
        let budget = budget.expect("asserted empty resident domain");
        let charge = (budget.try_charge(1)).expect("one byte must fit the eight-byte budget");
        assert_eq!((charge.capacity(), budget.resident()), (1, 1));
    });

    region::Token::scope_pinned(Pin::new(&mut domain), |token, domain| {
        let domain = domain.get_mut();
        let budget = domain.try_budget(13, token.proof());
        let budget = budget.expect("asserted empty resident domain");
        assert_eq!(budget.capacity(), 13);
    });
}