]> git.meshlink.io Git - meshlink/blob - src/event.h
Remove global variable "now".
[meshlink] / src / event.h
1 /*
2     event.h -- I/O, timeout and signal event handling
3     Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef __TINC_EVENT_H__
21 #define __TINC_EVENT_H__
22
23 #include "splay_tree.h"
24
25 #define IO_READ 1
26 #define IO_WRITE 2
27
28 typedef struct event_loop_t event_loop_t;
29
30 typedef void (*io_cb_t)(event_loop_t *loop, void *data, int flags);
31 typedef void (*timeout_cb_t)(event_loop_t *loop, void *data);
32 typedef void (*signal_cb_t)(event_loop_t *loop, void *data);
33
34 typedef struct io_t {
35         int fd;
36         int flags;
37         io_cb_t cb;
38         void *data;
39         struct splay_node_t node;
40 } io_t;
41
42 typedef struct timeout_t {
43         struct timeval tv;
44         timeout_cb_t cb;
45         void *data;
46         struct splay_node_t node;
47 } timeout_t;
48
49 typedef struct signal_t {
50         int signum;
51         signal_cb_t cb;
52         void *data;
53         struct splay_node_t node;
54 } signal_t;
55
56 struct event_loop_t {
57         fd_set readfds;
58         fd_set writefds;
59
60         volatile bool running;
61         struct timeval now;
62         
63         splay_tree_t ios;
64         splay_tree_t timeouts;
65         splay_tree_t signals;
66
67         io_t signalio;
68         int pipefd[2];
69
70         void *data;
71 };
72
73 extern event_loop_t *loop;
74
75 extern void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags);
76 extern void io_del(event_loop_t *loop, io_t *io);
77 extern void io_set(event_loop_t *loop, io_t *io, int flags);
78
79 extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timeval *tv);
80 extern void timeout_del(event_loop_t *loop, timeout_t *timeout);
81 extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timeval *tv);
82
83 extern void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum);
84 extern void signal_trigger(event_loop_t *loop, signal_t *sig);
85 extern void signal_del(event_loop_t *loop, signal_t *sig);
86
87 extern void event_loop_init(event_loop_t *loop);
88 extern void event_loop_exit(event_loop_t *loop);
89 extern bool event_loop_run(event_loop_t *loop);
90 extern void event_loop_flush_output(event_loop_t *loop);
91 extern void event_loop_stop(event_loop_t *loop);
92
93 #endif