#![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(())
}