+#ifndef MESHLINK_EVENT_H
+#define MESHLINK_EVENT_H
+
/*
- event.h -- header for event.c
- Copyright (C) 2002-2003 Guus Sliepen <guus@sliepen.eu.org>,
- 2002-2003 Ivo Timmermans <ivo@o2w.nl>
+ event.h -- I/O, timeout and signal event handling
+ Copyright (C) 2014, 2017 Guus Sliepen <guus@meshlink.io>
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
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id: event.h,v 1.1.4.6 2003/07/12 17:41:45 guus Exp $
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 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 <pthread.h>
-#include <time.h>
-#include <avl_tree.h>
+#define IO_READ 1
+#define IO_WRITE 2
-extern avl_tree_t *event_tree;
+typedef struct event_loop_t event_loop_t;
-typedef void (*event_handler_t)(void *);
+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 {
- time_t time;
- int id;
- event_handler_t handler;
+typedef struct io_t {
+ struct splay_node_t node;
+ int fd;
+ int flags;
+ io_cb_t cb;
void *data;
-} event_t;
+} io_t;
+
+typedef struct timeout_t {
+ struct splay_node_t node;
+ struct timeval tv;
+ timeout_cb_t cb;
+ void *data;
+} timeout_t;
+
+typedef struct signal_t {
+ struct splay_node_t node;
+ int signum;
+ bool set;
+ signal_cb_t cb;
+ void *data;
+} signal_t;
+
+struct event_loop_t {
+ void *data;
+
+ volatile bool running;
+ bool deletion;
+
+ struct timeval now;
+
+ splay_tree_t timeouts;
+ idle_cb_t idle_cb;
+ void *idle_data;
+ splay_tree_t ios;
+ splay_tree_t signals;
+
+ fd_set readfds;
+ fd_set writefds;
+
+ io_t signalio;
+ int pipefd[2];
+};
+
+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 init_events(void);
-extern void exit_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 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) __attribute__((__warn_unused_result__));
+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 /* __TINC_EVENT_H__ */
+#endif