/* SPDX-License-Identifier: LGPL-2.1+ */

#ifndef __LXC_MAINLOOP_H
#define __LXC_MAINLOOP_H

#include <stdint.h>

#include "list.h"

#define LXC_MAINLOOP_ERROR -1
#define LXC_MAINLOOP_CONTINUE 0
#define LXC_MAINLOOP_CLOSE 1

struct lxc_epoll_descr {
	int epfd;
	struct lxc_list handlers;
};

typedef int (*lxc_mainloop_callback_t)(int fd, uint32_t event, void *data,
				       struct lxc_epoll_descr *descr);

extern int lxc_mainloop(struct lxc_epoll_descr *descr, int timeout_ms);

extern int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd,
				    lxc_mainloop_callback_t callback,
				    void *data);

extern int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd);

extern int lxc_mainloop_open(struct lxc_epoll_descr *descr);

extern int lxc_mainloop_close(struct lxc_epoll_descr *descr);

static inline void __auto_lxc_mainloop_close__(struct lxc_epoll_descr **descr)
{
	if (*descr)
		lxc_mainloop_close(*descr);
}

#define __do_lxc_mainloop_close \
	__attribute__((__cleanup__(__auto_lxc_mainloop_close__)))

#endif
