X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=io_uring_engine.cpp;fp=io_uring_engine.cpp;h=f8295aacfde48f99e929a4dc2e0656b4f80dcd19;hb=e3b55e4779a980c277d5c8225856cc6943bc0869;hp=cadc6c33a79abeb12d2f63387b2f1fa6037b25f2;hpb=48be942bea5a1fabb09e9a0333c6dfb0ac7f2ebc;p=plocate diff --git a/io_uring_engine.cpp b/io_uring_engine.cpp index cadc6c3..f8295aa 100644 --- a/io_uring_engine.cpp +++ b/io_uring_engine.cpp @@ -71,28 +71,27 @@ void IOUringEngine::finish() #ifndef WITHOUT_URING bool anything_to_submit = true; while (pending_reads > 0) { - io_uring_cqe *cqes[queue_depth]; - int num_sqes = io_uring_peek_batch_cqe(&ring, cqes, queue_depth); - if (num_sqes == 0) { + io_uring_cqe *cqe; + if (io_uring_peek_cqe(&ring, &cqe) != 0) { if (anything_to_submit) { // Nothing ready, so submit whatever is pending and then do a blocking wait. - int ret = io_uring_submit(&ring); + int ret = io_uring_submit_and_wait(&ring, 1); if (ret < 0) { fprintf(stderr, "io_uring_submit(queued): %s\n", strerror(-ret)); exit(1); } anything_to_submit = false; + } else { + int ret = io_uring_wait_cqe(&ring, &cqe); + if (ret < 0) { + fprintf(stderr, "io_uring_wait_cqe: %s\n", strerror(-ret)); + exit(1); + } } - int ret = io_uring_wait_cqe(&ring, &cqes[0]); - if (ret < 0) { - fprintf(stderr, "io_uring_wait_cqe: %s\n", strerror(-ret)); - exit(1); - } - num_sqes = 1; } - for (int sqe_idx = 0; sqe_idx < num_sqes; ++sqe_idx) { - io_uring_cqe *cqe = cqes[sqe_idx]; + unsigned head; + io_uring_for_each_cqe(&ring, head, cqe) { PendingRead *pending = reinterpret_cast(cqe->user_data); if (cqe->res <= 0) { fprintf(stderr, "async read failed: %s\n", strerror(-cqe->res)); @@ -129,19 +128,19 @@ void IOUringEngine::finish() anything_to_submit = true; } } + } - // See if there are any queued reads we can submit now. - while (!queued_reads.empty() && pending_reads < queue_depth) { - io_uring_sqe *sqe = io_uring_get_sqe(&ring); - if (sqe == nullptr) { - fprintf(stderr, "io_uring_get_sqe: %s\n", strerror(errno)); - exit(1); - } - QueuedRead &qr = queued_reads.front(); - submit_read_internal(sqe, qr.fd, qr.len, qr.offset, move(qr.cb)); - queued_reads.pop(); - anything_to_submit = true; + // See if there are any queued reads we can submit now. + while (!queued_reads.empty() && pending_reads < queue_depth) { + io_uring_sqe *sqe = io_uring_get_sqe(&ring); + if (sqe == nullptr) { + fprintf(stderr, "io_uring_get_sqe: %s\n", strerror(errno)); + exit(1); } + QueuedRead &qr = queued_reads.front(); + submit_read_internal(sqe, qr.fd, qr.len, qr.offset, move(qr.cb)); + queued_reads.pop(); + anything_to_submit = true; } } #endif