diff --git a/src/io/uring/Queue.cxx b/src/io/uring/Queue.cxx index 9b4cd050d..f1f4080f3 100644 --- a/src/io/uring/Queue.cxx +++ b/src/io/uring/Queue.cxx @@ -51,8 +51,8 @@ Queue::AddPending(struct io_uring_sqe &sqe, io_uring_sqe_set_data(&sqe, c); } -void -Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept +inline void +Queue::_DispatchOneCompletion(const struct io_uring_cqe &cqe) noexcept { void *data = io_uring_cqe_get_data(&cqe); if (data != nullptr) { @@ -64,7 +64,12 @@ Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept delete c; } } +} +void +Queue::DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept +{ + _DispatchOneCompletion(cqe); ring.SeenCompletion(cqe); } @@ -79,6 +84,14 @@ Queue::DispatchOneCompletion() return true; } +inline unsigned +Queue::DispatchCompletions(struct io_uring_cqe &_cqe) noexcept +{ + return ring.VisitCompletions(&_cqe, [](const struct io_uring_cqe &cqe){ + _DispatchOneCompletion(cqe); + }); +} + bool Queue::WaitDispatchOneCompletion() { diff --git a/src/io/uring/Queue.hxx b/src/io/uring/Queue.hxx index 02d4fbdff..a8e04bccc 100644 --- a/src/io/uring/Queue.hxx +++ b/src/io/uring/Queue.hxx @@ -104,7 +104,13 @@ public: bool SubmitAndWaitDispatchOneCompletion(struct __kernel_timespec &timeout); private: + static void _DispatchOneCompletion(const struct io_uring_cqe &cqe) noexcept; void DispatchOneCompletion(struct io_uring_cqe &cqe) noexcept; + + /** + * Dispatch all completions using io_uring_for_each_cqe(). + */ + unsigned DispatchCompletions(struct io_uring_cqe &cqe) noexcept; }; } // namespace Uring