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