use super::{Context, NonNull, OutSlot, PackedEndpointHandle, Poll, WaiterTransfer};
impl<'cfg, T> crate::runtime::SessionKit<'cfg, T>
where
T: crate::transport::Transport + 'cfg,
{
pub(super) unsafe fn preview_public_send<const ROLE: u8>(
ptr: NonNull<()>,
handle: PackedEndpointHandle,
logical_label: u8,
payload_schema: u32,
out: *mut crate::endpoint::kernel::SendPreview,
) -> crate::endpoint::SendResult<()> {
let mut waiters = WaiterTransfer::empty();
unsafe {
Self::with_public_endpoint_mut::<'_, ROLE, _>(
ptr,
handle,
Err(crate::endpoint::SendError::Transport(
crate::transport::TransportError::Failed,
)),
|kernel| {
let preview =
kernel.preview_send_meta(logical_label, payload_schema, &mut waiters)?;
OutSlot::new(out).write(preview);
Ok(())
},
)
}
}
pub(super) unsafe fn init_public_send_state_raw<const ROLE: u8>(
ptr: NonNull<()>,
handle: PackedEndpointHandle,
init: *const crate::endpoint::kernel::SendInit,
) -> crate::endpoint::kernel::PublicOpLease {
let init = unsafe {
&*init
};
unsafe {
Self::with_public_endpoint_mut::<'cfg, ROLE, _>(
ptr,
handle,
crate::endpoint::kernel::PublicOpLease::Rejected,
|kernel| kernel.init_public_send_state(init),
)
}
}
pub(super) unsafe fn reset_public_send_state_raw<const ROLE: u8>(
ptr: NonNull<()>,
handle: PackedEndpointHandle,
) {
let mut waiters = WaiterTransfer::empty();
unsafe {
Self::with_public_endpoint_mut::<'cfg, ROLE, _>(ptr, handle, (), |kernel| {
kernel.reset_public_send_state(&mut waiters);
});
}
}
pub(super) unsafe fn poll_send_public_endpoint<const ROLE: u8>(
ptr: NonNull<()>,
handle: PackedEndpointHandle,
payload: Option<crate::endpoint::kernel::RawSendPayload>,
cx: &mut Context<'_>,
out: *mut (),
) {
let mut waiters = WaiterTransfer::with_replacement(cx.waker());
let poll = unsafe {
Self::with_public_endpoint_mut::<'cfg, ROLE, _>(
ptr,
handle,
Poll::Ready(Err(crate::endpoint::SendError::Transport(
crate::transport::TransportError::Failed,
))),
|kernel| kernel.poll_public_send(cx, payload, &mut waiters),
)
};
OutSlot::erased::<
Poll<crate::endpoint::SendResult<crate::endpoint::kernel::SendCommitOutcome<'cfg>>>,
>(out)
.write(poll);
}
}