io_uring_setup 1.0.0

internal crate
Documentation
#![no_std]
#![allow(clippy::missing_safety_doc)]

use core::ffi::c_void;
use core::mem::zeroed;
use core::ptr::addr_of_mut;

use io_uring_header::{io_uring_params, IORING_SETUP_CQSIZE, IORING_SETUP_SQPOLL};
use map_err::map_val;

pub struct Fd {
    fd: i32,
}

impl Fd {
    pub unsafe fn get(&self) -> i32 {
        self.fd
    }
}

impl Drop for Fd {
    fn drop(&mut self) {
        unsafe {
            close(self.fd).unwrap();
        }
    }
}

pub unsafe fn setup(nr_sqe: u32, nr_cqe: u32, flags: u32) -> Result<(Fd, io_uring_params), i32> {
    let mut params: io_uring_params = zeroed();
    params.cq_entries = nr_cqe;
    params.sq_thread_idle = 100;
    params.flags = IORING_SETUP_CQSIZE | IORING_SETUP_SQPOLL | flags;
    let fd = map_val(io_uring_syscall::io_uring_setup(
        nr_sqe,
        addr_of_mut!(params) as *mut c_void,
    ))?;
    Ok((Fd { fd }, params))
}

pub unsafe fn close(fd: i32) -> Result<(), i32> {
    map_val(io_uring_syscall::close(fd))?;
    Ok(())
}