diff options
author | James Rouzier <rouzier@gmail.com> | 2019-09-25 15:35:06 -0400 |
---|---|---|
committer | James Rouzier <rouzier@gmail.com> | 2019-09-25 20:11:50 -0400 |
commit | 0b88d72b1a4bbf0a90da2067f489fbb788dc1e92 (patch) | |
tree | d877b5fe9c8093771105d23e0b042de8b632338a /src | |
parent | 46850c3a617e361c133c4da3d6e3069807ebe2b7 (diff) | |
download | liburing-0b88d72b1a4bbf0a90da2067f489fbb788dc1e92.tar.gz liburing-0b88d72b1a4bbf0a90da2067f489fbb788dc1e92.tar.bz2 |
Add io_uring_peek_batch_cqe()
io_uring_peek_batch_cqe(), get multiple cqe from the queue at once.
Returns the number of cqe gotten.
test/cq-peek-batch.c: tests io_uring_peek_batch_cqe()
Signed-off-by: James Rouzier <rouzier@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/liburing.h | 2 | ||||
-rw-r--r-- | src/queue.c | 23 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/include/liburing.h b/src/include/liburing.h index 5de8aab..6367307 100644 --- a/src/include/liburing.h +++ b/src/include/liburing.h @@ -72,6 +72,8 @@ extern int io_uring_queue_mmap(int fd, struct io_uring_params *p, extern void io_uring_queue_exit(struct io_uring *ring); extern int io_uring_peek_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr); +unsigned io_uring_peek_batch_cqe(struct io_uring *ring, + struct io_uring_cqe **cqes, unsigned count); extern int io_uring_wait_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr); extern int io_uring_wait_cqes_timeout(struct io_uring *ring, diff --git a/src/queue.c b/src/queue.c index 18040d5..470c3a2 100644 --- a/src/queue.c +++ b/src/queue.c @@ -53,6 +53,29 @@ int io_uring_peek_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr) } /* + * Fill in an array of IO completions up to count, if any are available. + * Returns the amount of IO completions filled. + */ +unsigned io_uring_peek_batch_cqe(struct io_uring *ring, struct io_uring_cqe **cqes, unsigned count) +{ + unsigned ready = io_uring_cq_ready(ring); + if (ready) { + count = count > ready ? ready : count; + unsigned head = *ring->cq.khead; + unsigned last = head + count; + unsigned mask = *ring->cq.kring_mask; + int i = 0; + for (;head!=last;head++,i++) { + cqes[i] = &ring->cq.cqes[head & mask]; + } + + return count; + } + + return 0; +} + +/* * Return an IO completion, waiting for it if necessary. Returns 0 with * cqe_ptr filled in on success, -errno on failure. */ |