use crate::slab::AcceptRec;
use crate::slab::FutexWaitRec;
use crate::slab::ProvideBuffersRec;
use crate::slab::SendZcRec;
use crate::slab::{RecvMultiRec, RecvRec};
use io_uring_owner::Owner;
use io_uring_opcode::OpCompletion;
#[derive(Clone, Debug)]
pub enum Completion<C> {
Accept(AcceptRec),
ProvideBuffers(ProvideBuffersRec),
FutexWait(FutexWaitRec),
Recv(RecvRec),
RecvMulti(RecvMultiRec),
SendZc(SendZcRec),
#[cfg(feature = "connect")]
Connect(C),
#[cfg(feature = "epoll")]
EpollCtl(C),
Op(C),
}
impl<C: OpCompletion> Completion<C> {
#[inline]
pub(crate) fn entry(&self) -> io_uring::squeue::Entry {
match self {
Completion::Recv(r) => r.entry(),
Completion::RecvMulti(r) => r.entry(),
Completion::SendZc(r) => r.entry(),
Completion::Op(r) => r.entry(),
#[cfg(feature = "connect")]
Completion::Connect(r) => r.entry(),
#[cfg(feature = "epoll")]
Completion::EpollCtl(r) => r.entry(),
_ => todo!(),
}
}
#[inline]
pub(crate) fn owner(&self) -> Owner {
match self {
Self::Recv(ref recv) => recv.owner(),
Self::RecvMulti(ref recv_multi) => recv_multi.owner(),
Self::SendZc(ref send_zc) => send_zc.owner(),
Self::Op(ref impl_op) => impl_op.owner(),
#[cfg(feature = "connect")]
Self::Connect(ref impl_op) => impl_op.owner(),
#[cfg(feature = "epoll")]
Self::EpollCtl(ref impl_op) => impl_op.owner(),
_ => todo!(),
}
}
#[inline]
pub(crate) fn force_owner_kernel(&mut self) -> bool {
match self {
Self::Recv(ref mut recv) => recv.force_owner_kernel(),
Self::RecvMulti(ref mut recv_multi) => recv_multi.force_owner_kernel(),
Self::SendZc(ref mut send_zc) => send_zc.force_owner_kernel(),
Self::Op(ref mut impl_op) => impl_op.force_owner_kernel(),
#[cfg(feature = "connect")]
Self::Connect(ref mut impl_op) => impl_op.force_owner_kernel(),
#[cfg(feature = "epoll")]
Self::EpollCtl(ref mut impl_op) => impl_op.force_owner_kernel(),
_ => todo!(),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum SubmissionRecordStatus {
Retain,
Forget,
}