X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fevent.h;h=a87685da1c361152343d185e3bf566bde1e3dc30;hb=8d4b96efb7955eaa96174af4804597f92e124041;hp=3d49fe2d9b825e74e41d9c581b3b4891fd993290;hpb=93f89bcae11e8d250831896bc5694ee8bd2ad22b;p=meshlink diff --git a/src/event.h b/src/event.h index 3d49fe2d..a87685da 100644 --- a/src/event.h +++ b/src/event.h @@ -1,6 +1,9 @@ +#ifndef MESHLINK_EVENT_H +#define MESHLINK_EVENT_H + /* event.h -- I/O, timeout and signal event handling - Copyright (C) 2014 Guus Sliepen + Copyright (C) 2014, 2017 Guus Sliepen 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 @@ -17,10 +20,9 @@ 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 #define IO_READ 1 #define IO_WRITE 2 @@ -30,65 +32,71 @@ 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; - struct 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; - struct 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; - struct splay_node_t node; } signal_t; struct event_loop_t { - fd_set readfds; - fd_set writefds; + void *data; volatile bool running; - struct timeval now; - - splay_tree_t ios; + 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]; - - void *data; }; -extern event_loop_t *loop; -extern struct timeval now; +void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags); +void io_del(event_loop_t *loop, io_t *io); +void io_set(event_loop_t *loop, io_t *io, int flags); -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); +void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv); +void timeout_del(event_loop_t *loop, timeout_t *timeout); +void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv); -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); +void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum); +void signal_trigger(event_loop_t *loop, signal_t *sig); +void signal_del(event_loop_t *loop, signal_t *sig); -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); +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 void event_loop_flush_output(event_loop_t *loop); -extern void event_loop_stop(event_loop_t *loop); +void event_loop_init(event_loop_t *loop); +void event_loop_exit(event_loop_t *loop); +bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) __attribute__((__warn_unused_result__)); +void event_loop_flush_output(event_loop_t *loop); +void event_loop_start(event_loop_t *loop); +void event_loop_stop(event_loop_t *loop); #endif