]> git.meshlink.io Git - meshlink/blob - src/event.h
Handle io_t's being deleted out of order while going through loop->ios.
[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 __MESHLINK_EVENT_H__
21 #define __MESHLINK_EVENT_H__
22
23 #include "splay_tree.h"
24 #include "system.h"
25
26 #define IO_READ 1
27 #define IO_WRITE 2
28
29 typedef struct event_loop_t event_loop_t;
30
31 typedef void (*io_cb_t)(event_loop_t *loop, void *data, int flags);
32 typedef void (*timeout_cb_t)(event_loop_t *loop, void *data);
33 typedef void (*signal_cb_t)(event_loop_t *loop, void *data);
34
35 typedef struct io_t {
36         int fd;
37         int flags;
38         io_cb_t cb;
39         void *data;
40         struct splay_node_t node;
41 } io_t;
42
43 typedef struct timeout_t {
44         struct timeval tv;
45         timeout_cb_t cb;
46         void *data;
47         struct splay_node_t node;
48 } timeout_t;
49
50 typedef struct signal_t {
51         int signum;
52         signal_cb_t cb;
53         void *data;
54         struct splay_node_t node;
55 } signal_t;
56
57 struct event_loop_t {
58         fd_set readfds;
59         fd_set writefds;
60
61         volatile bool running;
62         struct timeval now;
63         bool deletion;
64         
65         splay_tree_t ios;
66         splay_tree_t timeouts;
67         splay_tree_t signals;
68
69         io_t signalio;
70         int pipefd[2];
71
72         void *data;
73 };
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