#ifndef IOLOOP_H
#define IOLOOP_H
#include <sys/time.h>
#include <time.h>
struct io;
struct timeout;
struct ioloop;
enum io_condition {
IO_READ = 0x01,
IO_WRITE = 0x02,
IO_ERROR = 0x04,
IO_NOTIFY = 0x08
};
enum io_notify_result {
IO_NOTIFY_ADDED,
IO_NOTIFY_NOTFOUND,
IO_NOTIFY_NOSUPPORT
};
typedef void io_callback_t(void *context);
typedef void timeout_callback_t(void *context);
typedef void io_loop_time_moved_callback_t(time_t old_time, time_t new_time);
extern time_t ioloop_time;
extern struct timeval ioloop_timeval;
extern struct ioloop *current_ioloop;
struct io *io_add(int fd, enum io_condition condition,
io_callback_t *callback, void *context);
#define io_add(fd, condition, callback, context) \
CONTEXT_CALLBACK(io_add, io_callback_t, \
callback, context, fd, condition)
enum io_notify_result io_add_notify(const char *path, io_callback_t *callback,
void *context, struct io **io_r);
#ifdef CONTEXT_TYPE_SAFETY
# define io_add_notify(path, callback, context, io_r) \
({(void)(1 ? 0 : callback(context)); \
io_add_notify(path, (io_callback_t *)callback, context, io_r); })
#else
# define io_add_notify(path, callback, context, io_r) \
io_add_notify(path, (io_callback_t *)callback, context, io_r)
#endif
void io_remove(struct io **io);
void io_remove_closed(struct io **io);
struct timeout *timeout_add(unsigned int msecs, timeout_callback_t *callback,
void *context);
#define timeout_add(msecs, callback, context) \
CONTEXT_CALLBACK(timeout_add, timeout_callback_t, \
callback, context, msecs)
void timeout_remove(struct timeout **timeout);
void timeout_reset(struct timeout *timeout);
void io_loop_time_refresh(void);
void io_loop_run(struct ioloop *ioloop);
void io_loop_stop(struct ioloop *ioloop);
bool io_loop_is_running(struct ioloop *ioloop);
void io_loop_set_running(struct ioloop *ioloop);
void io_loop_handler_run(struct ioloop *ioloop);
struct ioloop *io_loop_create(void);
void io_loop_set_max_fd_count(struct ioloop *ioloop, unsigned int max_fds);
void io_loop_destroy(struct ioloop **ioloop);
void io_loop_set_time_moved_callback(struct ioloop *ioloop,
io_loop_time_moved_callback_t *callback);
void io_loop_set_current(struct ioloop *ioloop);
struct ioloop_log *io_loop_log_new(struct ioloop *ioloop);
void io_loop_log_ref(struct ioloop_log *log);
void io_loop_log_unref(struct ioloop_log **log);
void io_loop_log_set_prefix(struct ioloop_log *log, const char *prefix);
void io_loop_set_default_log_prefix(struct ioloop *ioloop, const char *prefix);
#endif