io\_uring\_for\_each\_cqe(3) liburing Manual io\_uring\_for\_each\_cqe(3)

# [NAME](#NAME)

io\_uring\_for\_each\_cqe - iterate pending completion events

# [SYNOPSIS](#SYNOPSIS)

```
#include <liburing.h>
```

```
io_uring_for_each_cqe(struct io_uring *ring,
                      unsigned head,
                      struct io_uring_cqe *cqe) { }
```

# [DESCRIPTION](#DESCRIPTION)

The [**io\_uring\_for\_each\_cqe**(3)](/man/os/liburing/io_uring_for_each_cqe.3) is a macro helper that iterates completion events belonging to the *ring* using *head* as a temporary iterator, and points *cqe* to each pending event when iterating.

This helper provides an efficient way to iterate all pending events in the ring, and then advancing the CQ ring by calling [**io\_uring\_cq\_advance**(3)](/man/os/liburing/io_uring_cq_advance.3) with the number of CQEs consumed when done. As updating the kernel visible CQ ring state involves an ordered write, doing it once for a number of events is more efficient than handling each completion separately and calling [**io\_uring\_cqe\_seen**(3)](/man/os/liburing/io_uring_cqe_seen.3) for each of them.

# [EXAMPLE](#EXAMPLE)

```
void handle_cqes(struct io_uring *ring)
{
	struct io_uring_cqe *cqe;
	unsigned head;
	unsigned i = 0;
	io_uring_for_each_cqe(ring, head, cqe) {
		/* handle completion */
		printf("cqe: %d\n", cqe->res);
		i++;
	}
	io_uring_cq_advance(ring, i);
}
```

# [RETURN VALUE](#RETURN_VALUE)

None

# [SEE ALSO](#SEE_ALSO)

[**io\_uring\_wait\_cqe\_timeout**(3)](/man/os/liburing/io_uring_wait_cqe_timeout.3), [**io\_uring\_wait\_cqe**(3)](/man/os/liburing/io_uring_wait_cqe.3), [**io\_uring\_wait\_cqes**(3)](/man/os/liburing/io_uring_wait_cqes.3), [**io\_uring\_cqe\_seen**(3)](/man/os/liburing/io_uring_cqe_seen.3), [**io\_uring\_buf\_ring\_cq\_advance**(3)](/man/os/liburing/io_uring_buf_ring_cq_advance.3)

June 4, 2023 liburing-2.4

---

Document: io_uring_for_each_cqe(3) from liburing 2.15-r5 (Chainguard OS)
Source: https://github.com/axboe/liburing.git
