Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ fn main() -> io::Result<()> {
let cqe = ring.completion().next().expect("completion queue is empty");

assert_eq!(cqe.user_data(), 0x42);
assert!(cqe.result() >= 0, "read error: {}", cqe.result());
let _bytes_read = cqe.result().expect("read error");

Ok(())
}
Expand Down
2 changes: 1 addition & 1 deletion examples/readme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ fn main() -> io::Result<()> {
let cqe = ring.completion().next().expect("completion queue is empty");

assert_eq!(cqe.user_data(), 0x42);
assert!(cqe.result() >= 0, "read error: {}", cqe.result());
let _bytes_read = cqe.result().expect("read error");

Ok(())
}
20 changes: 9 additions & 11 deletions examples/tcp_echo.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::VecDeque;
use std::net::TcpListener;
use std::os::unix::io::{AsRawFd, RawFd};
use std::{io, ptr};
use std::ptr;

use io_uring::{opcode, squeue, types, IoUring, SubmissionQueue};
use slab::Slab;
Expand Down Expand Up @@ -100,17 +100,15 @@ fn main() -> anyhow::Result<()> {
accept.push_to(&mut sq);

for cqe in &mut cq {
let ret = cqe.result();
let token_index = cqe.user_data() as usize;

if ret < 0 {
eprintln!(
"token {:?} error: {:?}",
token_alloc.get(token_index),
io::Error::from_raw_os_error(-ret)
);
continue;
}
let ret = match cqe.result() {
Ok(x) => x,
Err(e) => {
eprintln!("token {:?} error: {e:?}", token_alloc.get(token_index),);
continue;
}
};

let token = &mut token_alloc[token_index];
match token.clone() {
Expand All @@ -119,7 +117,7 @@ fn main() -> anyhow::Result<()> {

accept.count += 1;

let fd = ret;
let fd = ret as i32;
let poll_token = token_alloc.insert(Token::Poll { fd });

let poll_e = opcode::PollAdd::new(types::Fd(fd), libc::POLLIN as _)
Expand Down
50 changes: 37 additions & 13 deletions io-uring-test/src/tests/cancel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,11 @@ pub fn test_async_cancel_user_data<S: squeue::EntryMarker, C: cqueue::EntryMarke
assert_eq!(cqes[0].user_data(), 2003);
assert_eq!(cqes[1].user_data(), 2004);

assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[1].result(), 0); // the number of requests cancelled
assert_eq!(
cqes[0].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(cqes[1].result().unwrap(), 0); // the number of requests cancelled

Ok(())
}
Expand Down Expand Up @@ -96,9 +99,15 @@ pub fn test_async_cancel_user_data_all<S: squeue::EntryMarker, C: cqueue::EntryM
assert_eq!(cqes[1].user_data(), 2003);
assert_eq!(cqes[2].user_data(), 2004);

assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[1].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[2].result(), 2); // the number of requests cancelled
assert_eq!(
cqes[0].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(
cqes[1].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(cqes[2].result().unwrap(), 2); // the number of requests cancelled

Ok(())
}
Expand Down Expand Up @@ -147,9 +156,15 @@ pub fn test_async_cancel_any<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
assert_eq!(cqes[1].user_data(), 2004);
assert_eq!(cqes[2].user_data(), 2005);

assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[1].result(), -libc::ECANCELED);
assert_eq!(cqes[2].result(), 2); // the number of requests cancelled
assert_eq!(
cqes[0].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(
cqes[1].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
);
assert_eq!(cqes[2].result().unwrap(), 2); // the number of requests cancelled

Ok(())
}
Expand Down Expand Up @@ -196,8 +211,11 @@ pub fn test_async_cancel_fd<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
assert_eq!(cqes[0].user_data(), 2003);
assert_eq!(cqes[1].user_data(), 2004);

assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[1].result(), 0);
assert_eq!(
cqes[0].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(cqes[1].result().unwrap(), 0);

Ok(())
}
Expand Down Expand Up @@ -247,9 +265,15 @@ pub fn test_async_cancel_fd_all<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
assert_eq!(cqes[1].user_data(), 2004);
assert_eq!(cqes[2].user_data(), 2005);

assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED
assert_eq!(cqes[1].result(), -libc::ECANCELED);
assert_eq!(cqes[2].result(), 2); // the number of requests cancelled
assert_eq!(
cqes[0].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
); // -ECANCELED
assert_eq!(
cqes[1].result().unwrap_err().raw_os_error().unwrap(),
libc::ECANCELED
);
assert_eq!(cqes[2].result().unwrap(), 2); // the number of requests cancelled

Ok(())
}
Expand Down
15 changes: 7 additions & 8 deletions io-uring-test/src/tests/epoll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ pub fn test_ready<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
.next()
.unwrap();
assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT);
assert_eq!(cqe.result(), 2);
assert_eq!(cqe.result().unwrap(), 2);

// read

Expand Down Expand Up @@ -114,8 +114,8 @@ pub fn test_not_ready<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
ring.submit_and_wait(1)?;
for cqe in ring.completion().map(Into::<cqueue::Entry>::into).take(1) {
assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT);
assert!(0 <= cqe.result() && cqe.result() <= 2);
nr = cqe.result();
assert!(cqe.result().unwrap() <= 2);
nr = cqe.result().unwrap();
}

// read
Expand Down Expand Up @@ -186,7 +186,7 @@ pub fn test_delete<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
for cqe in ring.completion().map(Into::<cqueue::Entry>::into).take(1) {
assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT);
// check for only one event
assert!(cqe.result() == 1);
assert_eq!(cqe.result().unwrap(), 1);
}

// check that both writes still happened
Expand Down Expand Up @@ -261,9 +261,9 @@ pub fn test_remove<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
ring.submit_and_wait(1)?;
for cqe in ring.completion().map(Into::<cqueue::Entry>::into).take(1) {
assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT);
let err = cqe.result();
let err = cqe.result().unwrap_err().raw_os_error().unwrap();
// check that we got the expected errors
assert!([-::libc::EAGAIN, -::libc::EBADF].contains(&err));
assert!([libc::EAGAIN, libc::EBADF].contains(&err));
}

Ok(())
Expand Down Expand Up @@ -342,8 +342,7 @@ pub fn test_race<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
.map(Into::<cqueue::Entry>::into)
.unwrap();
assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT);
assert!(cqe.result() >= 0);
let nr = cqe.result();
let nr = cqe.result().unwrap();

// process the events
prune_read(&mut readers, &events, nr as _)?;
Expand Down
Loading