diff --git a/src/io_uring.rs b/src/io_uring.rs index f5bd6b68..865634e4 100644 --- a/src/io_uring.rs +++ b/src/io_uring.rs @@ -5,7 +5,8 @@ use { io_uring::{ ops::{ accept::AcceptTask, async_cancel::AsyncCancelTask, connect::ConnectTask, - poll::PollTask, read_write::ReadWriteTask, recvmsg::RecvmsgTask, + poll::PollTask, read_write::ReadWriteTask, + read_write_no_cancel::ReadWriteNoCancelTask, recvmsg::RecvmsgTask, sendmsg::SendmsgTask, timeout::TimeoutTask, timeout_link::TimeoutLinkTask, }, pending_result::PendingResults, @@ -205,6 +206,7 @@ impl IoUring { tasks: Default::default(), pending_results: Default::default(), cached_read_writes: Default::default(), + cached_read_writes_no_cancel: Default::default(), cached_cancels: Default::default(), cached_polls: Default::default(), cached_sendmsg: Default::default(), @@ -266,6 +268,7 @@ struct IoUringData { pending_results: PendingResults, cached_read_writes: Stack>, + cached_read_writes_no_cancel: Stack>, cached_cancels: Stack>, cached_polls: Stack>, cached_sendmsg: Stack>, diff --git a/src/io_uring/ops.rs b/src/io_uring/ops.rs index 64ea36b7..15fc1235 100644 --- a/src/io_uring/ops.rs +++ b/src/io_uring/ops.rs @@ -5,6 +5,7 @@ pub mod async_cancel; pub mod connect; pub mod poll; pub mod read_write; +pub mod read_write_no_cancel; pub mod recvmsg; pub mod sendmsg; pub mod timeout; diff --git a/src/io_uring/ops/read_write_no_cancel.rs b/src/io_uring/ops/read_write_no_cancel.rs new file mode 100644 index 00000000..16729de7 --- /dev/null +++ b/src/io_uring/ops/read_write_no_cancel.rs @@ -0,0 +1,139 @@ +#[cfg(test)] +mod tests; + +use { + crate::{ + io_uring::{ + pending_result::PendingResult, + sys::{io_uring_sqe, IORING_OP_READ, IORING_OP_WRITE}, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, TaskResultExt, + }, + time::Time, + utils::on_drop::OnDrop, + }, + uapi::{c, Fd}, +}; + +impl IoUring { + #[expect(dead_code)] + pub async fn read_no_cancel( + &self, + fd: Fd, + offset: usize, + buf: &mut [u8], + cancel: impl FnOnce(IoUringTaskId), + ) -> Result { + self.perform_no_cancel( + fd, + offset, + buf.as_mut_ptr(), + buf.len(), + None, + IORING_OP_READ, + cancel, + ) + .await + } + + #[expect(dead_code)] + pub async fn write_no_cancel( + &self, + fd: Fd, + offset: usize, + buf: &[u8], + timeout: Option