Skip to main content

compio_driver/
driver_type.rs

1/// Representing underlying driver type the fusion driver is using
2#[repr(u8)]
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4pub enum DriverType {
5    /// Using `polling` driver
6    Poll,
7    /// Using `io-uring` driver
8    IoUring,
9    /// Using `iocp` driver
10    IOCP,
11}
12
13impl DriverType {
14    /// Get the underlying driver type
15    #[cfg(fusion)]
16    pub(crate) fn suggest() -> DriverType {
17        use io_uring::opcode::*;
18
19        // Add more opcodes here if used
20        const USED_OP: &[u8] = &[
21            Read::CODE,
22            Readv::CODE,
23            Write::CODE,
24            Writev::CODE,
25            Fsync::CODE,
26            Accept::CODE,
27            Connect::CODE,
28            Recv::CODE,
29            Send::CODE,
30            RecvMsg::CODE,
31            SendMsg::CODE,
32            PollAdd::CODE,
33        ];
34
35        if USED_OP.iter().all(|op| crate::sys::is_op_supported(*op)) {
36            DriverType::IoUring
37        } else {
38            DriverType::Poll
39        }
40    }
41
42    /// Check if the current driver is `polling`
43    pub fn is_polling(&self) -> bool {
44        *self == DriverType::Poll
45    }
46
47    /// Check if the current driver is `io-uring`
48    pub fn is_iouring(&self) -> bool {
49        *self == DriverType::IoUring
50    }
51
52    /// Check if the current driver is `iocp`
53    pub fn is_iocp(&self) -> bool {
54        *self == DriverType::IOCP
55    }
56}