#pragma once #include <err.h> #include <liburing.h> #include "common.h" #define GET_SQE_ATTEMPTS 1000000 struct io_uring_sqe* sqpoll_ring_get_sqe(struct io_uring* ring) { struct io_uring_sqe* sqe; size_t attempts = 0; for (;;) { sqe = io_uring_get_sqe(ring); if (likely(sqe)) return sqe; ++attempts; if (attempts < GET_SQE_ATTEMPTS) continue; errx(EXIT_FAILURE, "failed to get sqe after %d", GET_SQE_ATTEMPTS); } } #define SQPOLL_RING_ENTRIES 16 void io_uring_init_sqpoll(struct io_uring* ring) { int res = io_uring_queue_init(SQPOLL_RING_ENTRIES, ring, IORING_SETUP_SQPOLL); if (res < 0) { errno = -res; err(EXIT_FAILURE, "io_uring_setup failed"); } }