-} 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__ */
+} 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 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