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}