diff --git a/src/io_uring.rs b/src/io_uring.rs index baf4c934..23b8749d 100644 --- a/src/io_uring.rs +++ b/src/io_uring.rs @@ -22,7 +22,6 @@ use { copyhashmap::CopyHashMap, errorfmt::ErrorFmt, mmap::{mmap, Mmapped}, - numcell::NumCell, oserror::OsError, ptr_ext::{MutPtrExt, PtrExt}, stack::Stack, @@ -254,10 +253,10 @@ struct IoUringData { cqes_consumed: AsyncEvent, - next: NumCell, - to_encode: SyncQueue, - pending_in_kernel: CopyHashMap, - tasks: CopyHashMap>, + next: IoUringTaskIds, + to_encode: SyncQueue, + pending_in_kernel: CopyHashMap, + tasks: CopyHashMap>, pending_results: PendingResults, @@ -276,7 +275,7 @@ struct IoUringData { } unsafe trait Task { - fn id(&self) -> u64; + fn id(&self) -> IoUringTaskId; fn complete(self: Box, ring: &IoUringData, res: i32); fn encode(&self, sqe: &mut io_uring_sqe); @@ -347,8 +346,9 @@ impl IoUringData { let entry = self.cqmap.deref()[idx].get(); head = head.wrapping_add(1); self.cqhead.deref().store(head, Release); - if let Some(pending) = self.tasks.remove(&entry.user_data) { - self.pending_in_kernel.remove(&entry.user_data); + let id = IoUringTaskId(entry.user_data); + if let Some(pending) = self.tasks.remove(&id) { + self.pending_in_kernel.remove(&id); pending.complete(self, entry.res); } } @@ -384,7 +384,7 @@ impl IoUringData { let sqe = self.sqesmap.deref()[idx].get().deref_mut(); self.sqmap.deref()[idx].set(idx as _); *sqe = Default::default(); - sqe.user_data = id; + sqe.user_data = id.raw(); task.encode(sqe); if has_timeout { sqe.flags |= IOSQE_IO_LINK; @@ -404,11 +404,11 @@ impl IoUringData { } } - fn id_raw(&self) -> u64 { - self.next.fetch_add(1) + fn id_raw(&self) -> IoUringTaskId { + self.next.next() } - fn cancel_task(&self, id: u64) { + fn cancel_task(&self, id: IoUringTaskId) { if !self.tasks.contains(&id) { return; } @@ -466,8 +466,17 @@ impl IoUringData { } } +linear_ids!(IoUringTaskIds, IoUringTaskId, u64); + +#[expect(clippy::derivable_impls)] +impl Default for IoUringTaskId { + fn default() -> Self { + Self(0) + } +} + struct Cancellable<'a> { - id: u64, + id: IoUringTaskId, data: &'a IoUringData, } diff --git a/src/io_uring/ops/accept.rs b/src/io_uring/ops/accept.rs index 6f751dcf..149592ea 100644 --- a/src/io_uring/ops/accept.rs +++ b/src/io_uring/ops/accept.rs @@ -2,7 +2,7 @@ use { crate::io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_ACCEPT}, - IoUring, IoUringData, IoUringError, Task, TaskResultExt, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, TaskResultExt, }, std::rc::Rc, uapi::{c, OwnedFd}, @@ -39,14 +39,14 @@ struct Data { #[derive(Default)] pub struct AcceptTask { - id: u64, + id: IoUringTaskId, fd: i32, flags: u32, data: Option, } unsafe impl Task for AcceptTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/async_cancel.rs b/src/io_uring/ops/async_cancel.rs index d322fd3b..3874ab98 100644 --- a/src/io_uring/ops/async_cancel.rs +++ b/src/io_uring/ops/async_cancel.rs @@ -2,7 +2,7 @@ use { crate::{ io_uring::{ sys::{io_uring_sqe, IORING_OP_ASYNC_CANCEL}, - IoUringData, Task, + IoUringData, IoUringTaskId, Task, }, utils::errorfmt::ErrorFmt, }, @@ -11,12 +11,12 @@ use { #[derive(Default)] pub struct AsyncCancelTask { - id: u64, - target: u64, + id: IoUringTaskId, + target: IoUringTaskId, } impl IoUringData { - pub fn cancel_task_in_kernel(&self, target: u64) { + pub fn cancel_task_in_kernel(&self, target: IoUringTaskId) { let id = self.id_raw(); let mut task = self.cached_cancels.pop().unwrap_or_default(); task.id = id; @@ -26,7 +26,7 @@ impl IoUringData { } unsafe impl Task for AsyncCancelTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } @@ -41,7 +41,7 @@ unsafe impl Task for AsyncCancelTask { fn encode(&self, sqe: &mut io_uring_sqe) { sqe.opcode = IORING_OP_ASYNC_CANCEL; - sqe.u2.addr = self.target; + sqe.u2.addr = self.target.raw(); } fn is_cancel(&self) -> bool { diff --git a/src/io_uring/ops/connect.rs b/src/io_uring/ops/connect.rs index 0aca6829..a23d460e 100644 --- a/src/io_uring/ops/connect.rs +++ b/src/io_uring/ops/connect.rs @@ -2,7 +2,7 @@ use { crate::io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_CONNECT}, - IoUring, IoUringData, IoUringError, Task, TaskResultExt, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, TaskResultExt, }, std::{mem, ptr, rc::Rc}, uapi::{c, OwnedFd, SockAddr}, @@ -37,7 +37,7 @@ struct Data { } pub struct ConnectTask { - id: u64, + id: IoUringTaskId, fd: i32, sockaddr: c::sockaddr_storage, addrlen: u64, @@ -47,7 +47,7 @@ pub struct ConnectTask { impl Default for ConnectTask { fn default() -> Self { Self { - id: 0, + id: Default::default(), fd: 0, sockaddr: uapi::pod_zeroed(), addrlen: 0, @@ -57,7 +57,7 @@ impl Default for ConnectTask { } unsafe impl Task for ConnectTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/poll.rs b/src/io_uring/ops/poll.rs index 6edab2d4..1ac45281 100644 --- a/src/io_uring/ops/poll.rs +++ b/src/io_uring/ops/poll.rs @@ -3,7 +3,7 @@ use { ops::TaskResult, pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_POLL_ADD}, - IoUring, IoUringData, IoUringError, Task, TaskResultExt, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, TaskResultExt, }, std::rc::Rc, uapi::{c, OwnedFd}, @@ -45,14 +45,14 @@ struct Data { #[derive(Default)] pub struct PollTask { - id: u64, + id: IoUringTaskId, events: u16, fd: i32, data: Option, } unsafe impl Task for PollTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/read_write.rs b/src/io_uring/ops/read_write.rs index 9ebf2c1d..f8db92cb 100644 --- a/src/io_uring/ops/read_write.rs +++ b/src/io_uring/ops/read_write.rs @@ -3,7 +3,7 @@ use { io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_READ, IORING_OP_WRITE}, - IoUring, IoUringData, IoUringError, Task, TaskResultExt, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, TaskResultExt, }, time::Time, utils::buf::Buf, @@ -66,7 +66,7 @@ struct ReadWriteTaskData { #[derive(Default)] pub struct ReadWriteTask { - id: u64, + id: IoUringTaskId, has_timeout: bool, fd: c::c_int, buf: usize, @@ -76,7 +76,7 @@ pub struct ReadWriteTask { } unsafe impl Task for ReadWriteTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/recvmsg.rs b/src/io_uring/ops/recvmsg.rs index 4196f8d4..6bea0d09 100644 --- a/src/io_uring/ops/recvmsg.rs +++ b/src/io_uring/ops/recvmsg.rs @@ -3,7 +3,7 @@ use { io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_RECVMSG}, - IoUring, IoUringData, IoUringError, Task, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, }, utils::buf::Buf, }, @@ -85,7 +85,7 @@ struct Data { } pub struct RecvmsgTask { - id: u64, + id: IoUringTaskId, fd: c::c_int, bufs: Vec, iovecs: Vec, @@ -97,7 +97,7 @@ pub struct RecvmsgTask { impl Default for RecvmsgTask { fn default() -> Self { RecvmsgTask { - id: 0, + id: Default::default(), fd: 0, bufs: vec![], iovecs: vec![], @@ -109,7 +109,7 @@ impl Default for RecvmsgTask { } unsafe impl Task for RecvmsgTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/sendmsg.rs b/src/io_uring/ops/sendmsg.rs index 23cb7a8f..67d7b4e8 100644 --- a/src/io_uring/ops/sendmsg.rs +++ b/src/io_uring/ops/sendmsg.rs @@ -3,7 +3,7 @@ use { io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_SENDMSG}, - IoUring, IoUringData, IoUringError, Task, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, }, time::Time, utils::{buf::Buf, vec_ext::UninitVecExt}, @@ -91,7 +91,7 @@ struct SendmsgTaskData { } pub struct SendmsgTask { - id: u64, + id: IoUringTaskId, iovecs: Vec, msghdr: c::msghdr, bufs: Vec, @@ -106,7 +106,7 @@ impl Default for SendmsgTask { fn default() -> Self { unsafe { SendmsgTask { - id: 0, + id: Default::default(), iovecs: vec![], msghdr: MaybeUninit::zeroed().assume_init(), bufs: vec![], @@ -121,7 +121,7 @@ impl Default for SendmsgTask { } unsafe impl Task for SendmsgTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/timeout.rs b/src/io_uring/ops/timeout.rs index 3567a56f..e8067c61 100644 --- a/src/io_uring/ops/timeout.rs +++ b/src/io_uring/ops/timeout.rs @@ -2,7 +2,7 @@ use { crate::io_uring::{ pending_result::PendingResult, sys::{io_uring_sqe, IORING_OP_TIMEOUT, IORING_TIMEOUT_ABS}, - IoUring, IoUringData, IoUringError, Task, + IoUring, IoUringData, IoUringError, IoUringTaskId, Task, }, uapi::c, }; @@ -16,7 +16,7 @@ pub(super) struct timespec64 { #[derive(Default)] pub struct TimeoutTask { - id: u64, + id: IoUringTaskId, timespec: timespec64, pr: Option, } @@ -42,7 +42,7 @@ impl IoUring { } unsafe impl Task for TimeoutTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id } diff --git a/src/io_uring/ops/timeout_link.rs b/src/io_uring/ops/timeout_link.rs index aabaa421..023fbd99 100644 --- a/src/io_uring/ops/timeout_link.rs +++ b/src/io_uring/ops/timeout_link.rs @@ -2,14 +2,14 @@ use crate::{ io_uring::{ ops::timeout::timespec64, sys::{io_uring_sqe, IORING_OP_LINK_TIMEOUT, IORING_TIMEOUT_ABS}, - IoUring, IoUringData, Task, + IoUring, IoUringData, IoUringTaskId, Task, }, time::Time, }; #[derive(Default)] pub struct TimeoutLinkTask { - id: u64, + id: IoUringTaskId, timespec: timespec64, } @@ -27,7 +27,7 @@ impl IoUring { } unsafe impl Task for TimeoutLinkTask { - fn id(&self) -> u64 { + fn id(&self) -> IoUringTaskId { self.id }