#ifndef _IO_URING_H_
#define _IO_URING_H_
#ifdef __cpluscplus
extern "C"
{
#endif
#define MAX_BATCH_CQE_NUM 128
struct io_uring_instance;
/*
* ring_size : 1024
* buff_size : 2048
* flags : 0
* IORING_SETUP_IOPOLL(1U << 0) io_context is polled
* IORING_SETUP_SQPOLL(1U << 1) SQ poll thread
* IORING_SETUP_SQ_AFF(1U << 2) sq_thread_cpu is valid
* ORING_SETUP_CQSIZE(1U << 3) app defines CQ size
* IORING_SETUP_CLAMP(1U << 4) clamp SQ/CQ ring sizes
* IORING_SETUP_ATTACH_WQ(1U << 5) attach to existing wq
* IORING_SETUP_R_DISABLED(1U << 6) start with ring disabled
* IORING_SETUP_SUBMIT_ALL(1U << 7) continue submit on error
* sq_thread_idle : 0
*/
struct io_uring_instance *io_uring_instance_create(int sockfd, int eventfd, int ring_size, int buff_size, int flags, int sq_thread_idle, int enable_debug);
void io_uring_instance_destory(struct io_uring_instance *instance);
typedef void read_callback(const char *data, int len, void *args);
// return 0 : success
// reutrn -1 : error
int io_uring_register_read_callback(struct io_uring_instance *instance, read_callback *read_cb, void *cb_arg);
int io_uring_submit_write_entry(struct io_uring_instance *instance, const char *data, int len);
// returns the number of processed entrys
int io_uring_peek_ready_entrys(struct io_uring_instance *instance);
}