X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fevent.h;h=cf3c70a163b531b331bef39a9b797d8cff53d875;hb=refs%2Fheads%2Fencrypted-storage;hp=38a4eb45ee7ccc44f831a75f79896d99c52d802e;hpb=50af33d01f425983dd2b1d7b61092a6325be3f41;p=meshlink diff --git a/src/event.h b/src/event.h index 38a4eb45..cf3c70a1 100644 --- a/src/event.h +++ b/src/event.h @@ -1,7 +1,9 @@ +#ifndef MESHLINK_EVENT_H +#define MESHLINK_EVENT_H + /* - event.h -- header for event.c - Copyright (C) 2002-2009 Guus Sliepen , - 2002-2005 Ivo Timmermans + event.h -- I/O, timeout and signal event handling + Copyright (C) 2014, 2017 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,30 +20,82 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __TINC_EVENT_H__ -#define __TINC_EVENT_H__ +#include "splay_tree.h" +#include "system.h" +#include + +#define IO_READ 1 +#define IO_WRITE 2 + +typedef struct event_loop_t event_loop_t; + +typedef void (*io_cb_t)(event_loop_t *loop, void *data, int flags); +typedef void (*timeout_cb_t)(event_loop_t *loop, void *data); +typedef void (*signal_cb_t)(event_loop_t *loop, void *data); +typedef struct timeval(*idle_cb_t)(event_loop_t *loop, void *data); + +typedef struct io_t { + int fd; + int flags; + io_cb_t cb; + void *data; + struct splay_node_t node; +} io_t; + +typedef struct timeout_t { + struct timeval tv; + timeout_cb_t cb; + void *data; + struct splay_node_t node; +} timeout_t; + +typedef struct signal_t { + int signum; + signal_cb_t cb; + void *data; + struct splay_node_t node; +} signal_t; + +struct event_loop_t { + fd_set readfds; + fd_set writefds; + + volatile bool running; + struct timeval now; + bool deletion; -#include "avl_tree.h" + splay_tree_t ios; + splay_tree_t timeouts; + splay_tree_t signals; -extern avl_tree_t *event_tree; + idle_cb_t idle_cb; + void *idle_data; -typedef void (*event_handler_t)(void *); + io_t signalio; + int pipefd[2]; -typedef struct event { - time_t time; - int id; - event_handler_t handler; void *data; -} event_t; - -extern void init_events(void); -extern void exit_events(void); -extern void expire_events(void); -extern event_t *new_event(void) __attribute__ ((__malloc__)); -extern void free_event(event_t *); -extern void event_add(event_t *); -extern void event_del(event_t *); -extern event_t *get_expired_event(void); -extern event_t *peek_next_event(void); - -#endif /* __TINC_EVENT_H__ */ +}; + +extern void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags); +extern void io_del(event_loop_t *loop, io_t *io); +extern void io_set(event_loop_t *loop, io_t *io, int flags); + +extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timeval *tv); +extern void timeout_del(event_loop_t *loop, timeout_t *timeout); +extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timeval *tv); + +extern void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum); +extern void signal_trigger(event_loop_t *loop, signal_t *sig); +extern void signal_del(event_loop_t *loop, signal_t *sig); + +extern void idle_set(event_loop_t *loop, idle_cb_t cb, void *data); + +extern void event_loop_init(event_loop_t *loop); +extern void event_loop_exit(event_loop_t *loop); +extern bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex); +extern void event_loop_flush_output(event_loop_t *loop); +extern void event_loop_start(event_loop_t *loop); +extern void event_loop_stop(event_loop_t *loop); + +#endif