dope-core 0.15.1

The manifold runtime
Documentation
use crate::driver::{
    self, route,
    schedule::ready::{self, credit},
};

#[derive(Clone, Copy)]
#[repr(transparent)]
pub(in crate::driver) struct Credits<'d>(driver::Reference<'d>);

impl<'d> Credits<'d> {
    pub(in crate::driver) const fn new(driver: driver::Reference<'d>) -> Self {
        Self(driver)
    }

    fn credit(self) -> credit::Credit<'d> {
        credit::Credit::new(&self.0.shared.scheduling.arena)
    }

    pub(in crate::driver) fn arm_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().arm(key, target.into_credit_token())
    }

    pub(in crate::driver) fn wake_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
        wake: driver::RecvCreditWake,
    ) {
        self.credit().wake(key, target.into_credit_token(), wake);
    }

    pub(in crate::driver) fn retain_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().retain(key, target.into_credit_token())
    }

    pub(in crate::driver) fn release_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
        wake: driver::RecvCreditWake,
    ) {
        self.credit().release(key, target.into_credit_token(), wake);
    }

    pub(in crate::driver) fn cancel_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().cancel(key, target.into_credit_token())
    }

    pub(in crate::driver) fn has_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().held(key, target.into_credit_token())
    }

    pub(in crate::driver) fn take_recv_credit<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> Option<driver::RecvCreditWake> {
        self.credit().take(key, target.into_credit_token())
    }

    pub(in crate::driver) fn arm_fixed_buffer<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().arm_buffer(key, target.into_credit_token())
    }

    pub(in crate::driver) fn cancel_fixed_buffer<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> bool {
        self.credit().cancel_buffer(key, target.into_credit_token())
    }

    pub(in crate::driver) fn take_fixed_buffer<T: route::Credit<'d>>(
        self,
        key: ready::FixedKey<'d>,
        target: T,
    ) -> Option<driver::RecvBufferCredit<'d>> {
        self.credit()
            .take_buffer(key, target.into_credit_token())
            .then_some(driver::RecvBufferCredit::new(self.0))
    }

    pub(in crate::driver) fn release_recv_buffers(self, count: usize) {
        self.credit().release_buffers(count);
    }

    pub(in crate::driver) fn release_recv_buffer(self) {
        self.credit().release_buffer();
    }
}

const _: () = assert!(
    std::mem::size_of::<Credits<'static>>() == std::mem::size_of::<driver::Reference<'static>>()
);