]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-event/test-event.c
po: update french translation
[thirdparty/systemd.git] / src / libsystemd / sd-event / test-event.c
CommitLineData
fd38203a
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2013 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include "sd-event.h"
23#include "log.h"
24#include "util.h"
25
26static int prepare_handler(sd_event_source *s, void *userdata) {
27 log_info("preparing %c", PTR_TO_INT(userdata));
28 return 1;
29}
30
12179984 31static bool got_a, got_b, got_c, got_unref;
9ec9694c 32static unsigned got_d;
fd38203a 33
12179984
LP
34static int unref_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
35 sd_event_source_unref(s);
36 got_unref = true;
37 return 0;
38}
39
fd38203a
LP
40static int io_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
41
42 log_info("got IO on %c", PTR_TO_INT(userdata));
43
44 if (userdata == INT_TO_PTR('a')) {
baf76283 45 assert_se(sd_event_source_set_enabled(s, SD_EVENT_OFF) >= 0);
fd38203a
LP
46 assert_se(!got_a);
47 got_a = true;
48 } else if (userdata == INT_TO_PTR('b')) {
49 assert_se(!got_b);
50 got_b = true;
9ec9694c
DS
51 } else if (userdata == INT_TO_PTR('d')) {
52 got_d++;
53 if (got_d < 2)
54 assert_se(sd_event_source_set_enabled(s, SD_EVENT_ONESHOT) >= 0);
55 else
56 assert_se(sd_event_source_set_enabled(s, SD_EVENT_OFF) >= 0);
fd38203a
LP
57 } else
58 assert_not_reached("Yuck!");
59
60 return 1;
61}
62
63static int child_handler(sd_event_source *s, const siginfo_t *si, void *userdata) {
64
65 assert(s);
66 assert(si);
67
68 log_info("got child on %c", PTR_TO_INT(userdata));
69
70 assert(userdata == INT_TO_PTR('f'));
71
6203e07a 72 assert_se(sd_event_exit(sd_event_source_get_event(s), 0) >= 0);
fd38203a
LP
73 sd_event_source_unref(s);
74
75 return 1;
76}
77
78static int signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
39883f62 79 sd_event_source *p = NULL;
fd38203a
LP
80 sigset_t ss;
81 pid_t pid;
82
83 assert(s);
84 assert(si);
85
86 log_info("got signal on %c", PTR_TO_INT(userdata));
87
88 assert(userdata == INT_TO_PTR('e'));
89
90 assert_se(sigemptyset(&ss) >= 0);
91 assert_se(sigaddset(&ss, SIGCHLD) >= 0);
92 assert_se(sigprocmask(SIG_BLOCK, &ss, NULL) >= 0);
93
94 pid = fork();
95 assert_se(pid >= 0);
96
97 if (pid == 0)
98 _exit(0);
99
151b9b96 100 assert_se(sd_event_add_child(sd_event_source_get_event(s), &p, pid, WEXITED, child_handler, INT_TO_PTR('f')) >= 0);
baf76283 101 assert_se(sd_event_source_set_enabled(p, SD_EVENT_ONESHOT) >= 0);
fd38203a
LP
102
103 sd_event_source_unref(s);
104
105 return 1;
106}
107
108static int defer_handler(sd_event_source *s, void *userdata) {
39883f62 109 sd_event_source *p = NULL;
fd38203a
LP
110 sigset_t ss;
111
112 assert(s);
113
114 log_info("got defer on %c", PTR_TO_INT(userdata));
115
116 assert(userdata == INT_TO_PTR('d'));
117
118 assert_se(sigemptyset(&ss) >= 0);
119 assert_se(sigaddset(&ss, SIGUSR1) >= 0);
120 assert_se(sigprocmask(SIG_BLOCK, &ss, NULL) >= 0);
151b9b96 121 assert_se(sd_event_add_signal(sd_event_source_get_event(s), &p, SIGUSR1, signal_handler, INT_TO_PTR('e')) >= 0);
baf76283 122 assert_se(sd_event_source_set_enabled(p, SD_EVENT_ONESHOT) >= 0);
fd38203a
LP
123 raise(SIGUSR1);
124
125 sd_event_source_unref(s);
126
127 return 1;
128}
129
130static bool do_quit = false;
131
132static int time_handler(sd_event_source *s, uint64_t usec, void *userdata) {
133 log_info("got timer on %c", PTR_TO_INT(userdata));
134
135 if (userdata == INT_TO_PTR('c')) {
136
137 if (do_quit) {
138 sd_event_source *p;
139
151b9b96 140 assert_se(sd_event_add_defer(sd_event_source_get_event(s), &p, defer_handler, INT_TO_PTR('d')) >= 0);
baf76283 141 assert_se(sd_event_source_set_enabled(p, SD_EVENT_ONESHOT) >= 0);
fd38203a
LP
142 } else {
143 assert(!got_c);
144 got_c = true;
145 }
146 } else
147 assert_not_reached("Huh?");
148
149 return 2;
150}
151
6203e07a 152static bool got_exit = false;
da7e457c 153
6203e07a 154static int exit_handler(sd_event_source *s, void *userdata) {
da7e457c
LP
155 log_info("got quit handler on %c", PTR_TO_INT(userdata));
156
6203e07a 157 got_exit = true;
da7e457c
LP
158
159 return 3;
160}
161
fd38203a
LP
162int main(int argc, char *argv[]) {
163 sd_event *e = NULL;
12179984 164 sd_event_source *w = NULL, *x = NULL, *y = NULL, *z = NULL, *q = NULL, *t = NULL;
fd38203a 165 static const char ch = 'x';
12179984 166 int a[2] = { -1, -1 }, b[2] = { -1, -1}, d[2] = { -1, -1}, k[2] = { -1, -1 };
fd38203a
LP
167
168 assert_se(pipe(a) >= 0);
169 assert_se(pipe(b) >= 0);
9ec9694c 170 assert_se(pipe(d) >= 0);
12179984 171 assert_se(pipe(k) >= 0);
fd38203a 172
afc6adb5 173 assert_se(sd_event_default(&e) >= 0);
fd38203a 174
cde93897
LP
175 assert_se(sd_event_set_watchdog(e, true) >= 0);
176
12179984
LP
177 /* Test whether we cleanly can destroy an io event source from its own handler */
178 got_unref = false;
151b9b96 179 assert_se(sd_event_add_io(e, &t, k[0], EPOLLIN, unref_handler, NULL) >= 0);
12179984
LP
180 assert_se(write(k[1], &ch, 1) == 1);
181 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
182 assert_se(got_unref);
183
9ec9694c
DS
184 got_a = false, got_b = false, got_c = false, got_d = 0;
185
186 /* Add a oneshot handler, trigger it, re-enable it, and trigger
187 * it again. */
151b9b96 188 assert_se(sd_event_add_io(e, &w, d[0], EPOLLIN, io_handler, INT_TO_PTR('d')) >= 0);
9ec9694c
DS
189 assert_se(sd_event_source_set_enabled(w, SD_EVENT_ONESHOT) >= 0);
190 assert_se(write(d[1], &ch, 1) >= 0);
191 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
192 assert_se(got_d == 1);
193 assert_se(write(d[1], &ch, 1) >= 0);
194 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
195 assert_se(got_d == 2);
fd38203a 196
151b9b96
LP
197 assert_se(sd_event_add_io(e, &x, a[0], EPOLLIN, io_handler, INT_TO_PTR('a')) >= 0);
198 assert_se(sd_event_add_io(e, &y, b[0], EPOLLIN, io_handler, INT_TO_PTR('b')) >= 0);
6a0f1f6d 199 assert_se(sd_event_add_time(e, &z, CLOCK_MONOTONIC, 0, 0, time_handler, INT_TO_PTR('c')) >= 0);
151b9b96 200 assert_se(sd_event_add_exit(e, &q, exit_handler, INT_TO_PTR('g')) >= 0);
fd38203a
LP
201
202 assert_se(sd_event_source_set_priority(x, 99) >= 0);
baf76283 203 assert_se(sd_event_source_set_enabled(y, SD_EVENT_ONESHOT) >= 0);
fd38203a
LP
204 assert_se(sd_event_source_set_prepare(x, prepare_handler) >= 0);
205 assert_se(sd_event_source_set_priority(z, 50) >= 0);
baf76283 206 assert_se(sd_event_source_set_enabled(z, SD_EVENT_ONESHOT) >= 0);
fd38203a 207 assert_se(sd_event_source_set_prepare(z, prepare_handler) >= 0);
a71fe8b8
LP
208
209 /* Test for floating event sources */
210 assert_se(sigprocmask_many(SIG_BLOCK, SIGRTMIN+1, -1) == 0);
211 assert_se(sd_event_add_signal(e, NULL, SIGRTMIN+1, NULL, NULL) >= 0);
fd38203a
LP
212
213 assert_se(write(a[1], &ch, 1) >= 0);
214 assert_se(write(b[1], &ch, 1) >= 0);
215
216 assert_se(!got_a && !got_b && !got_c);
217
218 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
219
220 assert_se(!got_a && got_b && !got_c);
221
222 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
223
224 assert_se(!got_a && got_b && got_c);
225
226 assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
227
228 assert_se(got_a && got_b && got_c);
229
230 sd_event_source_unref(x);
231 sd_event_source_unref(y);
232
233 do_quit = true;
234 assert_se(sd_event_source_set_time(z, now(CLOCK_MONOTONIC) + 200 * USEC_PER_MSEC) >= 0);
baf76283 235 assert_se(sd_event_source_set_enabled(z, SD_EVENT_ONESHOT) >= 0);
fd38203a
LP
236
237 assert_se(sd_event_loop(e) >= 0);
238
239 sd_event_source_unref(z);
da7e457c 240 sd_event_source_unref(q);
fd38203a 241
d5e4ec5b
LP
242 sd_event_source_unref(w);
243
fd38203a
LP
244 sd_event_unref(e);
245
3d94f76c
LP
246 safe_close_pair(a);
247 safe_close_pair(b);
248 safe_close_pair(d);
249 safe_close_pair(k);
fd38203a
LP
250
251 return 0;
252}