#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");
	}
}