io_uring_bearer/
completion.rs

1//! Competion types
2
3use crate::slab::AcceptRec;
4//use crate::slab::EpollRec;
5use crate::slab::FutexWaitRec;
6use crate::slab::ProvideBuffersRec;
7use crate::slab::SendZcRec;
8use crate::slab::{RecvMultiRec, RecvRec};
9//use crate::Owner;
10use io_uring_owner::Owner;
11
12use io_uring_opcode::OpCompletion;
13
14/// Completion types                      
15#[derive(Clone, Debug)]
16pub enum Completion<C> {
17    /// EpollCtl Completion               
18    //    EpollEvent(EpollRec),
19    /// Accept Completion                 
20    Accept(AcceptRec),
21    /// Provide Buffers
22    ProvideBuffers(ProvideBuffersRec),
23    /// Futex Wait
24    FutexWait(FutexWaitRec),
25    /// Recv
26    Recv(RecvRec),
27    /// RecvMulti
28    RecvMulti(RecvMultiRec),
29    /// SendZc
30    SendZc(SendZcRec),
31    /// Gen + OpExtConnect impl
32    #[cfg(feature = "connect")]
33    Connect(C),
34    /// Gen + OpExtEpollCtl impl
35    #[cfg(feature = "epoll")]
36    EpollCtl(C),
37    /// Gen Trait impl
38    Op(C),
39}
40
41impl<C: OpCompletion> Completion<C> {
42    #[inline]
43    pub(crate) fn entry(&self) -> io_uring::squeue::Entry {
44        match self {
45            Completion::Recv(r) => r.entry(),
46            Completion::RecvMulti(r) => r.entry(),
47            Completion::SendZc(r) => r.entry(),
48            Completion::Op(r) => r.entry(),
49            #[cfg(feature = "connect")]
50            Completion::Connect(r) => r.entry(),
51            #[cfg(feature = "epoll")]
52            Completion::EpollCtl(r) => r.entry(),
53            _ => todo!(),
54        }
55    }
56    #[inline]
57    pub(crate) fn owner(&self) -> Owner {
58        match self {
59            Self::Recv(ref recv) => recv.owner(),
60            Self::RecvMulti(ref recv_multi) => recv_multi.owner(),
61            Self::SendZc(ref send_zc) => send_zc.owner(),
62            Self::Op(ref impl_op) => impl_op.owner(),
63            #[cfg(feature = "connect")]
64            Self::Connect(ref impl_op) => impl_op.owner(),
65            #[cfg(feature = "epoll")]
66            Self::EpollCtl(ref impl_op) => impl_op.owner(),
67            _ => todo!(),
68        }
69    }
70    #[inline]
71    pub(crate) fn force_owner_kernel(&mut self) -> bool {
72        match self {
73            Self::Recv(ref mut recv) => recv.force_owner_kernel(),
74            Self::RecvMulti(ref mut recv_multi) => recv_multi.force_owner_kernel(),
75            Self::SendZc(ref mut send_zc) => send_zc.force_owner_kernel(),
76            Self::Op(ref mut impl_op) => impl_op.force_owner_kernel(),
77            #[cfg(feature = "connect")]
78            Self::Connect(ref mut impl_op) => impl_op.force_owner_kernel(),
79            #[cfg(feature = "epoll")]
80            Self::EpollCtl(ref mut impl_op) => impl_op.force_owner_kernel(),
81            _ => todo!(),
82        }
83    }
84}
85
86/// What to do with the submission record upon handling completion.
87/// Used within handle_completions Fn Return                       
88#[derive(Clone, Debug, PartialEq)]
89pub enum SubmissionRecordStatus {
90    /// Retain the original submsision record when it is needed to be retained.
91    /// For example EpollCtl original Userdata must be retained in multishot mode.
92    /// Downside is that care must be taken to clean up the associated sunmission record.
93    Retain,
94    /// Forget the associated submission record                                          
95    /// For example Accept original record can be deleted upon compleiton after read.    
96    /// Typically a new Accept submission is pushed without re-using any existing.       
97    Forget,
98}