]> git.meshlink.io Git - meshlink/blob - src/event.h
Call utcp_timeout() once every iteration of the event loop.
[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 typedef struct timeval (*idle_cb_t)(event_loop_t *loop, void *data);
35
36 typedef struct io_t {
37         int fd;
38         int flags;
39         io_cb_t cb;
40         void *data;
41         struct splay_node_t node;
42 } io_t;
43
44 typedef struct timeout_t {
45         struct timeval tv;
46         timeout_cb_t cb;
47         void *data;
48         struct splay_node_t node;
49 } timeout_t;
50
51 typedef struct signal_t {
52         int signum;
53         signal_cb_t cb;
54         void *data;
55         struct splay_node_t node;
56 } signal_t;
57
58 struct event_loop_t {
59         fd_set readfds;
60         fd_set writefds;
61
62         volatile bool running;
63         struct timeval now;
64         bool deletion;
65         
66         splay_tree_t ios;
67         splay_tree_t timeouts;
68         splay_tree_t signals;
69
70         idle_cb_t idle_cb;
71         void *idle_data;
72
73         io_t signalio;
74         int pipefd[2];
75
76         void *data;
77 };
78
79 extern void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags);
80 extern void io_del(event_loop_t *loop, io_t *io);
81 extern void io_set(event_loop_t *loop, io_t *io, int flags);
82
83 extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timeval *tv);
84 extern void timeout_del(event_loop_t *loop, timeout_t *timeout);
85 extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timeval *tv);
86
87 extern void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum);
88 extern void signal_trigger(event_loop_t *loop, signal_t *sig);
89 extern void signal_del(event_loop_t *loop, signal_t *sig);
90
91 extern void idle_set(event_loop_t *loop, idle_cb_t cb, void *data);
92
93 extern void event_loop_init(event_loop_t *loop);
94 extern void event_loop_exit(event_loop_t *loop);
95 extern bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex);
96 extern void event_loop_flush_output(event_loop_t *loop);
97 extern void event_loop_stop(event_loop_t *loop);
98
99 #endif