Skip to main content

dope_uring/driver/
cqe.rs

1use crate::sys::token::Token;
2
3use super::Driver;
4use super::wire::Wire;
5
6#[derive(Clone, Copy)]
7pub struct CqeView {
8    wire: Wire,
9    pub result: i32,
10    pub flags: u32,
11}
12
13#[derive(Clone, Copy)]
14pub enum CqeKind {
15    Accept(Token),
16    Recv(Token),
17    Write(Token),
18}
19
20impl CqeView {
21    #[inline(always)]
22    pub fn kind(&self) -> CqeKind {
23        match self.wire {
24            Wire::Accept(t) => CqeKind::Accept(t),
25            Wire::Recv(t) => CqeKind::Recv(t),
26            Wire::Write(t) => CqeKind::Write(t),
27            Wire::Request(_) | Wire::Ignore => {
28                unreachable!(
29                    "dope invariant violated: CqeView constructed for non-handler wire kind"
30                )
31            }
32        }
33    }
34
35    #[inline(always)]
36    pub fn more(&self) -> bool {
37        io_uring::cqueue::more(self.flags)
38    }
39
40    #[inline(always)]
41    pub fn buffer_select(&self) -> Option<u16> {
42        io_uring::cqueue::buffer_select(self.flags)
43    }
44
45    #[inline(always)]
46    pub fn notif(&self) -> bool {
47        io_uring::cqueue::notif(self.flags)
48    }
49}
50
51pub trait CqeRouter {
52    fn on_cqe(&mut self, driver: &mut Driver, cqe: CqeView);
53}
54
55#[derive(Clone, Copy)]
56pub(in crate::driver) struct RawCqe {
57    pub user_data: u64,
58    pub result: i32,
59    pub flags: u32,
60}
61
62#[inline(always)]
63pub(in crate::driver) fn make_view(wire: Wire, result: i32, flags: u32) -> CqeView {
64    CqeView {
65        wire,
66        result,
67        flags,
68    }
69}