+#ifndef MESHLINK_EVENT_H
+#define MESHLINK_EVENT_H
+
/*
event.h -- I/O, timeout and signal event handling
- Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
+ 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)(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 {
+ struct splay_node_t node;
int fd;
int flags;
io_cb_t cb;
void *data;
- struct splay_node_t node;
} io_t;
typedef struct timeout_t {
+ struct splay_node_t node;
struct timeval tv;
timeout_cb_t cb;
void *data;
- struct splay_node_t node;
} timeout_t;
typedef struct signal_t {
+ struct splay_node_t node;
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;
+ void *data;
volatile bool running;
+ bool deletion;
+
struct timeval now;
-
- splay_tree_t ios;
+
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];
-
- void *data;
};
-extern event_loop_t *loop;
-
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 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);
+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