Function io_uring_prep_readv

Source
pub unsafe fn io_uring_prep_readv(
    sqe: *mut io_uring_sqe,
    fd: c_int,
    iovecs: *mut iovec,
    nr_vecs: c_uint,
    offset: off_t,
)
Examples found in repository?
examples/io_uring_test.rs (line 44)
12fn main() {
13    let mut ring: io_uring = unsafe { mem::uninitialized() };
14
15    let ret = unsafe { io_uring_queue_init(QD, &mut ring, 0) };
16
17    if ret < 0 {
18        panic!("ret: {:?}", Error::from_raw_os_error(ret));
19    }
20
21    let args = env::args().collect::<Vec<_>>();
22    if args.len() < 2 {
23        println!("{}: file", args[0]);
24        return;
25    }
26    let file = File::open(&args[1]).unwrap();
27
28    let mut iovecs: Vec<libc::iovec> = vec![unsafe { mem::zeroed() }; QD as usize];
29    for iov in iovecs.iter_mut() {
30        let mut buf = unsafe { mem::uninitialized() };
31        if unsafe { posix_memalign(&mut buf, 4096, 4096) } != 0 {
32            panic!("can't allocate");
33        }
34        iov.iov_base = buf;
35        iov.iov_len = 4096;
36    }
37
38    let mut offset: usize = 0;
39    for i in 0.. {
40        let sqe = unsafe { io_uring_get_sqe(&mut ring) };
41        if sqe == std::ptr::null_mut() {
42            break;
43        }
44        unsafe { io_uring_prep_readv(sqe, file.as_raw_fd(), &mut iovecs[i], 1, offset as i64) };
45        offset += iovecs[i].iov_len;
46    }
47    let ret = unsafe { io_uring_submit(&mut ring) };
48    if ret < 0 {
49        panic!("ret: {:?}", Error::from_raw_os_error(ret));
50    }
51
52    let mut cqe: *mut io_uring_cqe = unsafe { std::mem::zeroed() };
53    let mut done = 0;
54    let pending = ret;
55    for _ in 0..pending {
56        let ret = unsafe { io_uring_wait_cqe(&mut ring, &mut cqe) };
57        if ret < 0 {
58            panic!("ret: {:?}", Error::from_raw_os_error(ret));
59        }
60        done += 1;
61        let mut stop = false;
62        if unsafe { (*cqe).res } != 4096 {
63            eprintln!("res = {}, wanted 4096", unsafe { (*cqe).res });
64            stop = true;
65        }
66        unsafe { io_uring_cqe_seen(&mut ring, cqe) };
67        if stop {
68            break;
69        }
70    }
71    println!("Submitted={}, completed={}", pending, done);
72    unsafe { io_uring_queue_exit(&mut ring) };
73}