ioloop.h revision 8d59f06c9422fa49b538e23ffb06eddb23c6add2
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen#ifndef __IOLOOP_H
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#define __IOLOOP_H
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen#include <sys/time.h>
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#include <time.h>
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct io;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstruct timeout;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstruct ioloop;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenenum io_condition {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen IO_READ = 0x01,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen IO_WRITE = 0x02,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen IO_ERROR = 0x04,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* internal */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen IO_NOTIFY = 0x04,
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen};
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainentypedef void io_callback_t(void *context);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainentypedef void timeout_callback_t(void *context);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* Time when the I/O loop started calling handlers.
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen Can be used instead of time(NULL). */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenextern time_t ioloop_time;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenextern struct timeval ioloop_timeval;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenextern struct timezone ioloop_timezone;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* I/O listeners - you can create different handlers for IO_READ and IO_WRITE,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen but make sure you don't create multiple handlers of same type, it's not
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen checked and removing one will stop the other from working as well.
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct io *io_add(int fd, enum io_condition condition,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen io_callback_t *callback, void *context);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct io *io_add_notify(const char *path, io_callback_t *callback,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen void *context);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_remove(struct io *io);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* Timeout handlers */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct timeout *timeout_add(unsigned int msecs, timeout_callback_t *callback,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen void *context);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid timeout_remove(struct timeout *timeout);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_loop_run(struct ioloop *ioloop);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_loop_stop(struct ioloop *ioloop); /* safe to run in signal handler */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenint io_loop_is_running(struct ioloop *ioloop);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen/* call these if you wish to run the iteration only once */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_loop_set_running(struct ioloop *ioloop);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_loop_handler_run(struct ioloop *ioloop);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct ioloop *io_loop_create(pool_t pool);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenvoid io_loop_destroy(struct ioloop *ioloop);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#endif
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen