]> git.meshlink.io Git - meshlink/blobdiff - src/event.h
Avoid allocating packet buffers unnecessarily.
[meshlink] / src / event.h
index d0129d0ce8ee54f7b613100379d24e4c94ea6854..31c326be141f37177d636b1dbfd7e65af7f8f3c4 100644 (file)
@@ -1,6 +1,9 @@
+#ifndef MESHLINK_EVENT_H
+#define MESHLINK_EVENT_H
+
 /*
     event.h -- I/O, timeout and signal event handling
-    Copyright (C) 2012 Guus Sliepen <guus@tinc-vpn.org>
+    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
     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>
 
 #define IO_READ 1
 #define IO_WRITE 2
 
-typedef void (*io_cb_t)(void *data, int flags);
-typedef void (*timeout_cb_t)(void *data);
-typedef void (*signal_cb_t)(void *data);
+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 timespec(*idle_cb_t)(event_loop_t *loop, void *data);
 
 typedef struct io_t {
+       struct splay_node_t node;
        int fd;
        int flags;
        io_cb_t cb;
        void *data;
-       splay_node_t node;
 } io_t;
 
 typedef struct timeout_t {
-       struct timeval tv;
+       struct splay_node_t node;
+       struct timespec tv;
        timeout_cb_t cb;
        void *data;
-       splay_node_t node;
 } timeout_t;
 
 typedef struct signal_t {
+       struct splay_node_t node;
        int signum;
+       bool set;
        signal_cb_t cb;
        void *data;
-       splay_node_t node;
 } signal_t;
 
-extern struct timeval now;
+struct event_loop_t {
+       void *data;
+
+       volatile bool running;
+       bool deletion;
+
+       struct timespec 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 io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags);
-extern void io_del(io_t *io);
-extern void io_set(io_t *io, int flags);
+extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv);
+extern void timeout_del(event_loop_t *loop, timeout_t *timeout);
+extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv);
 
-extern void timeout_add(timeout_t *timeout, timeout_cb_t cb, void *data, struct timeval *tv);
-extern void timeout_del(timeout_t *timeout);
-extern void timeout_set(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 signal_add(signal_t *sig, signal_cb_t cb, void *data, int signum);
-extern void signal_del(signal_t *sig);
+extern void idle_set(event_loop_t *loop, idle_cb_t cb, void *data);
 
-extern bool event_loop(void);
-extern void event_exit(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