From 6ae88d8442d3f47ab5ef2b207e03aa3482fdab79 Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Sat, 1 Feb 2020 23:04:36 +0300 Subject: [PATCH 1/2] helpers for getting some info about queues state --- src/cqe.rs | 10 ++++++++++ src/lib.rs | 20 ++++++++++++++++++++ src/sqe.rs | 10 ++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/cqe.rs b/src/cqe.rs index b6ffaab..40d96e6 100644 --- a/src/cqe.rs +++ b/src/cqe.rs @@ -54,6 +54,16 @@ impl<'ring> CompletionQueue<'ring> { Ok(CompletionQueueEvent::new(self.ring, &mut *cqe.assume_init())) } } + + pub fn num_cqes_ready(&self) -> u32 { + unsafe { + uring_sys::io_uring_cq_ready(self.ring.as_ptr()) + } + } + + pub fn has_ready_cqes(&self) -> bool { + self.num_cqes_ready() > 0 + } } unsafe impl<'ring> Send for CompletionQueue<'ring> { } diff --git a/src/lib.rs b/src/lib.rs index 24b31c6..e52ad75 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -217,6 +217,16 @@ impl IoUring { self.sq().submit_and_wait_with_timeout(wait_for, duration) } + pub fn sq_space_left(&self) -> u32 { + unsafe { + uring_sys::io_uring_sq_space_left(&self.ring as *const _ as *mut _) + } + } + + pub fn sq_has_space(&self) -> bool { + self.sq_space_left() > 0 + } + pub fn peek_for_cqe(&mut self) -> Option> { unsafe { let mut cqe = MaybeUninit::uninit(); @@ -288,6 +298,16 @@ impl IoUring { pub fn raw_mut(&mut self) -> &mut uring_sys::io_uring { &mut self.ring } + + pub fn num_cqes_ready(&self) -> u32 { + unsafe { + uring_sys::io_uring_cq_ready(self.raw() as *const _ as *mut _) + } + } + + pub fn has_ready_cqes(&self) -> bool { + self.num_cqes_ready() > 0 + } } impl Drop for IoUring { diff --git a/src/sqe.rs b/src/sqe.rs index 1f53267..17d2e3d 100644 --- a/src/sqe.rs +++ b/src/sqe.rs @@ -89,6 +89,16 @@ impl<'ring> SubmissionQueue<'ring> { } } + pub fn space_left(&self) -> u32 { + unsafe { + uring_sys::io_uring_sq_space_left(self.ring.as_ptr()) + } + } + + pub fn has_space(&self) -> bool { + self.space_left() > 0 + } + /// Submit all events in the queue. Returns the number of submitted events. /// /// If this function encounters any IO errors an [`io::Error`](std::io::Result) variant is returned. From 7425bbfc9659f9a75c658e69710ca6c7a703c766 Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Mon, 3 Feb 2020 21:31:14 +0300 Subject: [PATCH 2/2] remove code repetition --- src/lib.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e52ad75..5d5ffc2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -218,13 +218,11 @@ impl IoUring { } pub fn sq_space_left(&self) -> u32 { - unsafe { - uring_sys::io_uring_sq_space_left(&self.ring as *const _ as *mut _) - } + SubmissionQueue::new(&self).space_left() } pub fn sq_has_space(&self) -> bool { - self.sq_space_left() > 0 + SubmissionQueue::new(&self).has_space() } pub fn peek_for_cqe(&mut self) -> Option> { @@ -300,13 +298,11 @@ impl IoUring { } pub fn num_cqes_ready(&self) -> u32 { - unsafe { - uring_sys::io_uring_cq_ready(self.raw() as *const _ as *mut _) - } + CompletionQueue::new(&self).num_cqes_ready() } pub fn has_ready_cqes(&self) -> bool { - self.num_cqes_ready() > 0 + CompletionQueue::new(&self).has_ready_cqes() } }