#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);
// return  0 : success
// reutrn -1 : error
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);

#ifdef __cpluscplus
}
#endif

#endif
