Skip to main content

compio_driver/sys/op/
flag.rs

1bitflags::bitflags! {
2    /// Flags for operations.
3    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4    pub struct OpCodeFlag: u32 {
5        /// Detect `Read` OpCode
6        const Read = 1 << 0;
7        /// Detect `Readv` OpCode
8        const Readv = 1 << 1;
9        /// Detect `Write` OpCode
10        const Write = 1 << 2;
11        /// Detect `Writev` OpCode
12        const Writev = 1 << 3;
13        /// Detect `Fsync` OpCode
14        const Fsync = 1 << 4;
15        /// Detect `Accept` OpCode
16        const Accept = 1 << 5;
17        /// Detect `Connect` OpCode
18        const Connect = 1 << 6;
19        /// Detect `Recv` OpCode
20        const Recv = 1 << 7;
21        /// Detect `Send` OpCode
22        const Send = 1 << 8;
23        /// Detect `RecvMsg` OpCode
24        const RecvMsg = 1 << 9;
25        /// Detect `SendMsg` OpCode
26        const SendMsg = 1 << 10;
27        /// Detect `AsyncCancel` OpCode
28        const AsyncCancel = 1 << 11;
29        /// Detect `OpenAt` OpCode
30        const OpenAt = 1 << 12;
31        /// Detect `Close` OpCode
32        const Close = 1 << 13;
33        /// Detect `Splice` OpCode
34        const Splice = 1 << 14;
35        /// Detect `Shutdown` OpCode
36        const Shutdown = 1 << 15;
37        /// Detect `PollAdd` OpCode
38        const PollAdd = 1 << 16;
39    }
40}
41
42impl OpCodeFlag {
43    /// Get the [`OpCodeFlag`] corresponds to basic OpCodes that are commonly
44    /// used.
45    pub fn basic() -> Self {
46        OpCodeFlag::Read
47            | OpCodeFlag::Readv
48            | OpCodeFlag::Write
49            | OpCodeFlag::Writev
50            | OpCodeFlag::Fsync
51            | OpCodeFlag::Accept
52            | OpCodeFlag::Connect
53            | OpCodeFlag::Recv
54            | OpCodeFlag::Send
55            | OpCodeFlag::RecvMsg
56            | OpCodeFlag::SendMsg
57            | OpCodeFlag::PollAdd
58    }
59}
60
61#[cfg(io_uring)]
62impl OpCodeFlag {
63    pub(crate) fn get_codes(self) -> impl Iterator<Item = u8> {
64        use io_uring::opcode::*;
65
66        self.iter().map(|flag| match flag {
67            OpCodeFlag::Read => Read::CODE,
68            OpCodeFlag::Readv => Readv::CODE,
69            OpCodeFlag::Write => Write::CODE,
70            OpCodeFlag::Writev => Writev::CODE,
71            OpCodeFlag::Fsync => Fsync::CODE,
72            OpCodeFlag::Accept => Accept::CODE,
73            OpCodeFlag::Connect => Connect::CODE,
74            OpCodeFlag::Recv => Recv::CODE,
75            OpCodeFlag::Send => Send::CODE,
76            OpCodeFlag::RecvMsg => RecvMsg::CODE,
77            OpCodeFlag::SendMsg => SendMsg::CODE,
78            OpCodeFlag::AsyncCancel => AsyncCancel::CODE,
79            OpCodeFlag::OpenAt => OpenAt::CODE,
80            OpCodeFlag::Close => Close::CODE,
81            OpCodeFlag::Splice => Splice::CODE,
82            OpCodeFlag::Shutdown => Shutdown::CODE,
83            OpCodeFlag::PollAdd => PollAdd::CODE,
84            unknown => unreachable!("Unknown OpCodeFlag specified: {unknown:?}"),
85        })
86    }
87}