chiark / gitweb /
Merge pull request #22 from elogind/dev_v232
[elogind.git] / src / systemd / sd-event.h
1 #ifndef foosdeventhfoo
2 #define foosdeventhfoo
3
4 /***
5   This file is part of systemd.
6
7   Copyright 2013 Lennart Poettering
8
9   systemd is free software; you can redistribute it and/or modify it
10   under the terms of the GNU Lesser General Public License as published by
11   the Free Software Foundation; either version 2.1 of the License, or
12   (at your option) any later version.
13
14   systemd is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   Lesser General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 ***/
22
23 #include <inttypes.h>
24 #include <signal.h>
25 #include <sys/epoll.h>
26 #include <sys/signalfd.h>
27 #include <sys/types.h>
28
29 #include "_sd-common.h"
30
31 /*
32   Why is this better than pure epoll?
33
34   - Supports event source prioritization
35   - Scales better with a large number of time events because it does not require one timerfd each
36   - Automatically tries to coalesce timer events system-wide
37   - Handles signals and child PIDs
38 */
39
40 _SD_BEGIN_DECLARATIONS;
41
42 typedef struct sd_event sd_event;
43 typedef struct sd_event_source sd_event_source;
44
45 enum {
46         SD_EVENT_OFF = 0,
47         SD_EVENT_ON = 1,
48         SD_EVENT_ONESHOT = -1
49 };
50
51 enum {
52         SD_EVENT_INITIAL,
53         SD_EVENT_ARMED,
54         SD_EVENT_PENDING,
55         SD_EVENT_RUNNING,
56         SD_EVENT_EXITING,
57         SD_EVENT_FINISHED,
58         SD_EVENT_PREPARING
59 };
60
61 enum {
62         /* And everything in-between and outside is good too */
63         SD_EVENT_PRIORITY_IMPORTANT = -100,
64         SD_EVENT_PRIORITY_NORMAL = 0,
65         SD_EVENT_PRIORITY_IDLE = 100
66 };
67
68 typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata);
69 typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
70 typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
71 typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
72 #if 1 /// elogind is musl-libc compatible, which has other guards for siginfo_t
73 #if ( defined(__GLIBC__) \
74    && ( defined(__USE_POSIX199309) || defined(__USE_XOPEN_EXTENDED) ) ) \
75  || (!defined(__GLIBC__) \
76    && ( defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
77      || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
78      || defined(_BSD_SOURCE) ) )
79 typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
80 #else
81 typedef void* sd_event_child_handler_t;
82 #endif
83 #endif // 1
84
85 int sd_event_default(sd_event **e);
86
87 int sd_event_new(sd_event **e);
88 sd_event* sd_event_ref(sd_event *e);
89 sd_event* sd_event_unref(sd_event *e);
90
91 int sd_event_add_io(sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_event_io_handler_t callback, void *userdata);
92 int sd_event_add_time(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
93 int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
94 #if 0 /// UNNEEDED by elogind
95 int sd_event_add_child(sd_event *e, sd_event_source **s, pid_t pid, int options, sd_event_child_handler_t callback, void *userdata);
96 int sd_event_add_defer(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
97 #endif // 0
98 int sd_event_add_post(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
99 int sd_event_add_exit(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
100
101 int sd_event_prepare(sd_event *e);
102 int sd_event_wait(sd_event *e, uint64_t usec);
103 int sd_event_dispatch(sd_event *e);
104 int sd_event_run(sd_event *e, uint64_t usec);
105 #if 0 /// UNNEEDED by elogind
106 int sd_event_loop(sd_event *e);
107 #endif // 0
108 int sd_event_exit(sd_event *e, int code);
109
110 #if 0 /// UNNEEDED by elogind
111 int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec);
112
113 int sd_event_get_fd(sd_event *e);
114 #endif // 0
115 int sd_event_get_state(sd_event *e);
116 #if 0 /// UNNEEDED by elogind
117 int sd_event_get_tid(sd_event *e, pid_t *tid);
118 int sd_event_get_exit_code(sd_event *e, int *code);
119 #endif // 0
120 int sd_event_set_watchdog(sd_event *e, int b);
121 #if 0 /// UNNEEDED by elogind
122 int sd_event_get_watchdog(sd_event *e);
123 #endif // 0
124 int sd_event_get_iteration(sd_event *e, uint64_t *ret);
125
126 #if 0 /// UNNEEDED by elogind
127 sd_event_source* sd_event_source_ref(sd_event_source *s);
128 #endif // 0
129 sd_event_source* sd_event_source_unref(sd_event_source *s);
130
131 sd_event *sd_event_source_get_event(sd_event_source *s);
132 #if 0 /// UNNEEDED by elogind
133 void* sd_event_source_get_userdata(sd_event_source *s);
134 void* sd_event_source_set_userdata(sd_event_source *s, void *userdata);
135 #endif // 0
136
137 int sd_event_source_set_description(sd_event_source *s, const char *description);
138 #if 0 /// UNNEEDED by elogind
139 int sd_event_source_get_description(sd_event_source *s, const char **description);
140 #endif // 0
141 int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback);
142 #if 0 /// UNNEEDED by elogind
143 int sd_event_source_get_pending(sd_event_source *s);
144 int sd_event_source_get_priority(sd_event_source *s, int64_t *priority);
145 #endif // 0
146 int sd_event_source_set_priority(sd_event_source *s, int64_t priority);
147 #if 0 /// UNNEEDED by elogind
148 int sd_event_source_get_enabled(sd_event_source *s, int *enabled);
149 #endif // 0
150 int sd_event_source_set_enabled(sd_event_source *s, int enabled);
151 #if 0 /// UNNEEDED by elogind
152 int sd_event_source_get_io_fd(sd_event_source *s);
153 #endif // 0
154 int sd_event_source_set_io_fd(sd_event_source *s, int fd);
155 #if 0 /// UNNEEDED by elogind
156 int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events);
157 #endif // 0
158 int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
159 #if 0 /// UNNEEDED by elogind
160 int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
161 #endif // 0
162 int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
163 int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
164 #if 0 /// UNNEEDED by elogind
165 int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
166 int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
167 int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
168 int sd_event_source_get_signal(sd_event_source *s);
169 int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
170 #endif // 0
171
172 /* Define helpers so that __attribute__((cleanup(sd_event_unrefp))) and similar may be used. */
173 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event, sd_event_unref);
174 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source, sd_event_source_unref);
175
176 _SD_END_DECLARATIONS;
177
178 #endif