io_uring: improve IO_Uring.copy_cqe

copy_cqes() is not guaranteed to return as many CQEs as provided in the
`wait_nr` argument, meaning the assert in `copy_cqe` can trigger.

Instead, loop until we do get at least one CQE returned.

This mimics the behaviour of liburing's _io_uring_get_cqe.
This commit is contained in:
Vincent Rischmann 2022-01-01 01:23:26 +01:00 committed by Andrew Kelley
parent 8771ef897a
commit 4d38f456ea

View File

@ -300,9 +300,10 @@ pub const IO_Uring = struct {
/// A convenience method for `copy_cqes()` for when you don't need to batch or peek.
pub fn copy_cqe(ring: *IO_Uring) !io_uring_cqe {
var cqes: [1]io_uring_cqe = undefined;
const count = try ring.copy_cqes(&cqes, 1);
assert(count == 1);
return cqes[0];
while (true) {
const count = try ring.copy_cqes(&cqes, 1);
if (count > 0) return cqes[0];
}
}
/// Matches the implementation of cq_ring_needs_flush() in liburing.