2 releases

0.0.2 Oct 24, 2019
0.0.1 Oct 14, 2019

#2175 in Asynchronous

MIT/Apache

130KB
5K SLoC

C 4.5K SLoC // 0.1% comments Rust 313 SLoC // 0.1% comments RPM Specfile 47 SLoC Shell 31 SLoC

liburing raw bindings

Rust liburing#24bd087 raw bindings with tests.

Quick start

    // init
    let mut ring = unsafe {
        let mut s = mem::MaybeUninit::<io_uring>::uninit();
        let ret = io_uring_queue_init(QUEUE_DEPTH, s.as_mut_ptr(), 0);
        if ret < 0 {
            panic!(
                "io_uring_queue_init: {:?}",
                Error::from_raw_os_error(ret)
            );
        }
        s.assume_init()
    };

    // fill queue
    loop {
        let sqe = unsafe { io_uring_get_sqe(&mut ring) };
        if sqe == std::ptr::null_mut() {
            break;
        }
        unsafe { io_uring_prep_nop(sqe) };
    }

    // submit requests
    let ret = unsafe { io_uring_submit(&mut ring) };
    if ret < 0 {
        panic!("io_uring_submit: {:?}", Error::from_raw_os_error(ret));
    }

    // fetch completions
    let mut cqe: *mut io_uring_cqe = unsafe { std::mem::zeroed() };
    let pending = ret;
    for _ in 0..pending {
        let ret = unsafe { io_uring_wait_cqe(&mut ring, &mut cqe) };
        if ret < 0 {
            panic!(
                "io_uring_wait_cqe: {:?}",
                Error::from_raw_os_error(ret)
            );
        }
        if unsafe { (*cqe).res } < 0 {
            eprintln!("(*cqe).res = {}", unsafe { (*cqe).res });
        }
        unsafe { io_uring_cqe_seen(&mut ring, cqe) };
    }

    unsafe { io_uring_queue_exit(&mut ring) };

Dependencies

~0–2.2MB
~43K SLoC