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}