ioloop.h revision 3185a94a1253e1f513e056a49085a9baa5ffabc9
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#ifndef __IOLOOP_H
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define __IOLOOP_H
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include <sys/time.h>
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include <time.h>
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define IO_READ (1 << 0)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define IO_WRITE (1 << 1)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define IO_PRIORITY_LOW 100
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define IO_PRIORITY_DEFAULT 0
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define IO_PRIORITY_HIGH -100
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct io;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct timeout;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct ioloop;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschtypedef void io_callback_t(void *context);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschtypedef void timeout_callback_t(void *context);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch/* Time when the I/O loop started calling handlers.
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch Can be used instead of time(NULL). */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschextern time_t ioloop_time;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschextern struct timeval ioloop_timeval;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschextern struct timezone ioloop_timezone;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch/* I/O listeners - you can create different handlers for IO_READ and IO_WRITE,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch but make sure you don't create multiple handlers of same type, it's not
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch checked and removing one will stop the other from working as well. */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct io *io_add(int fd, int condition, io_callback_t *callback, void *context);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct io *io_add_priority(int fd, int priority, int condition,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch io_callback_t *callback, void *context);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid io_remove(struct io *io);
96fbbe9c6fd04bca25770020bf94eec50888bc9bStephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch/* Timeout handlers */
659f431cb56f26ec07e308db4d6c563c0eaa5300Stephan Boschstruct timeout *timeout_add(int msecs, timeout_callback_t *callback,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch void *context);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid timeout_remove(struct timeout *timeout);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid io_loop_run(struct ioloop *ioloop);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid io_loop_stop(struct ioloop *ioloop); /* safe to run in signal handler */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschint io_loop_is_running(struct ioloop *ioloop);
659f431cb56f26ec07e308db4d6c563c0eaa5300Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch/* call these if you wish to run the iteration only once */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid io_loop_set_running(struct ioloop *ioloop);
96fbbe9c6fd04bca25770020bf94eec50888bc9bStephan Boschvoid io_loop_handler_run(struct ioloop *ioloop);
620b60321d04006b32a116824d49b88b61be7131Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct ioloop *io_loop_create(pool_t pool);
620b60321d04006b32a116824d49b88b61be7131Stephan Boschvoid io_loop_destroy(struct ioloop *ioloop);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#endif