+#include "splay_tree.h"
+#include "system.h"
+#include <pthread.h>
+
+#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 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;
+} io_t;
+
+typedef struct timeout_t {
+ struct splay_node_t node;
+ struct timespec tv;
+ timeout_cb_t cb;
+ void *data;
+} timeout_t;
+
+typedef struct signal_t {
+ struct splay_node_t node;
+ int signum;
+ volatile atomic_flag set;
+ signal_cb_t cb;
+ void *data;
+} signal_t;
+
+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];
+};