io/uring/Ring: add io_uring_for_each_cqe() wrapper

This commit is contained in:
Max Kellermann 2025-02-04 19:58:37 +01:00 committed by Max Kellermann
parent c8e88408b2
commit a9bee1c64b

@ -126,6 +126,35 @@ public:
void SeenCompletion(struct io_uring_cqe &cqe) noexcept {
io_uring_cqe_seen(&ring, &cqe);
}
/**
* Invoke a function with a reference to each completion (but
* do not mark it "seen" or advance the completion queue
* head).
*/
unsigned ForEachCompletion(struct io_uring_cqe *cqe,
std::invocable<struct io_uring_cqe &> auto f) noexcept {
unsigned dummy, n = 0;
io_uring_for_each_cqe(&ring, dummy, cqe) {
++n;
f(*cqe);
}
return n;
}
/**
* Like ForEachCompletion(), but advance the completion queue
* head.
*/
unsigned VisitCompletions(struct io_uring_cqe *cqe,
std::invocable<const struct io_uring_cqe &> auto f) noexcept {
unsigned n = ForEachCompletion(cqe, f);
if (n > 0)
io_uring_cq_advance(&ring, n);
return n;
}
};
} // namespace Uring