1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
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.
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.
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/>.
22 #include <sys/epoll.h>
23 #include <sys/timerfd.h>
28 #include "sd-daemon.h"
33 #include "time-util.h"
40 #define EPOLL_QUEUE_MAX 512U
41 #define DEFAULT_ACCURACY_USEC (250 * USEC_PER_MSEC)
43 typedef enum EventSourceType {
47 SOURCE_TIME_MONOTONIC,
48 SOURCE_TIME_REALTIME_ALARM,
49 SOURCE_TIME_BOOTTIME_ALARM,
56 _SOURCE_EVENT_SOURCE_TYPE_MAX,
57 _SOURCE_EVENT_SOURCE_TYPE_INVALID = -1
60 #define EVENT_SOURCE_IS_TIME(t) IN_SET((t), SOURCE_TIME_REALTIME, SOURCE_TIME_BOOTTIME, SOURCE_TIME_MONOTONIC, SOURCE_TIME_REALTIME_ALARM, SOURCE_TIME_BOOTTIME_ALARM)
62 struct sd_event_source {
67 sd_event_handler_t prepare;
71 EventSourceType type:5;
78 unsigned pending_index;
79 unsigned prepare_index;
80 unsigned pending_iteration;
81 unsigned prepare_iteration;
83 LIST_FIELDS(sd_event_source, sources);
87 sd_event_io_handler_t callback;
94 sd_event_time_handler_t callback;
95 usec_t next, accuracy;
96 unsigned earliest_index;
97 unsigned latest_index;
100 sd_event_signal_handler_t callback;
101 struct signalfd_siginfo siginfo;
105 sd_event_child_handler_t callback;
111 sd_event_handler_t callback;
114 sd_event_handler_t callback;
117 sd_event_handler_t callback;
118 unsigned prioq_index;
126 /* For all clocks we maintain two priority queues each, one
127 * ordered for the earliest times the events may be
128 * dispatched, and one ordered by the latest times they must
129 * have been dispatched. The range between the top entries in
130 * the two prioqs is the time window we can freely schedule
150 /* timerfd_create() only supports these five clocks so far. We
151 * can add support for more clocks when the kernel learns to
152 * deal with them, too. */
153 struct clock_data realtime;
154 struct clock_data boottime;
155 struct clock_data monotonic;
156 struct clock_data realtime_alarm;
157 struct clock_data boottime_alarm;
162 sd_event_source **signal_sources;
164 Hashmap *child_sources;
165 unsigned n_enabled_child_sources;
174 dual_timestamp timestamp;
175 usec_t timestamp_boottime;
178 bool exit_requested:1;
179 bool need_process_child:1;
185 sd_event **default_event_ptr;
187 usec_t watchdog_last, watchdog_period;
191 LIST_HEAD(sd_event_source, sources);
194 static void source_disconnect(sd_event_source *s);
196 static int pending_prioq_compare(const void *a, const void *b) {
197 const sd_event_source *x = a, *y = b;
202 /* Enabled ones first */
203 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
205 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
208 /* Lower priority values first */
209 if (x->priority < y->priority)
211 if (x->priority > y->priority)
214 /* Older entries first */
215 if (x->pending_iteration < y->pending_iteration)
217 if (x->pending_iteration > y->pending_iteration)
220 /* Stability for the rest */
229 static int prepare_prioq_compare(const void *a, const void *b) {
230 const sd_event_source *x = a, *y = b;
235 /* Move most recently prepared ones last, so that we can stop
236 * preparing as soon as we hit one that has already been
237 * prepared in the current iteration */
238 if (x->prepare_iteration < y->prepare_iteration)
240 if (x->prepare_iteration > y->prepare_iteration)
243 /* Enabled ones first */
244 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
246 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
249 /* Lower priority values first */
250 if (x->priority < y->priority)
252 if (x->priority > y->priority)
255 /* Stability for the rest */
264 static int earliest_time_prioq_compare(const void *a, const void *b) {
265 const sd_event_source *x = a, *y = b;
267 assert(EVENT_SOURCE_IS_TIME(x->type));
268 assert(x->type == y->type);
270 /* Enabled ones first */
271 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
273 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
276 /* Move the pending ones to the end */
277 if (!x->pending && y->pending)
279 if (x->pending && !y->pending)
283 if (x->time.next < y->time.next)
285 if (x->time.next > y->time.next)
288 /* Stability for the rest */
297 static int latest_time_prioq_compare(const void *a, const void *b) {
298 const sd_event_source *x = a, *y = b;
300 assert(EVENT_SOURCE_IS_TIME(x->type));
301 assert(x->type == y->type);
303 /* Enabled ones first */
304 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
306 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
309 /* Move the pending ones to the end */
310 if (!x->pending && y->pending)
312 if (x->pending && !y->pending)
316 if (x->time.next + x->time.accuracy < y->time.next + y->time.accuracy)
318 if (x->time.next + x->time.accuracy > y->time.next + y->time.accuracy)
321 /* Stability for the rest */
330 static int exit_prioq_compare(const void *a, const void *b) {
331 const sd_event_source *x = a, *y = b;
333 assert(x->type == SOURCE_EXIT);
334 assert(y->type == SOURCE_EXIT);
336 /* Enabled ones first */
337 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
339 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
342 /* Lower priority values first */
343 if (x->priority < y->priority)
345 if (x->priority > y->priority)
348 /* Stability for the rest */
357 static void free_clock_data(struct clock_data *d) {
361 prioq_free(d->earliest);
362 prioq_free(d->latest);
365 static void event_free(sd_event *e) {
370 while ((s = e->sources)) {
372 source_disconnect(s);
373 sd_event_source_unref(s);
376 assert(e->n_sources == 0);
378 if (e->default_event_ptr)
379 *(e->default_event_ptr) = NULL;
381 safe_close(e->epoll_fd);
382 safe_close(e->signal_fd);
383 safe_close(e->watchdog_fd);
385 free_clock_data(&e->realtime);
386 free_clock_data(&e->boottime);
387 free_clock_data(&e->monotonic);
388 free_clock_data(&e->realtime_alarm);
389 free_clock_data(&e->boottime_alarm);
391 prioq_free(e->pending);
392 prioq_free(e->prepare);
395 free(e->signal_sources);
397 hashmap_free(e->child_sources);
398 set_free(e->post_sources);
402 _public_ int sd_event_new(sd_event** ret) {
406 assert_return(ret, -EINVAL);
408 e = new0(sd_event, 1);
413 e->signal_fd = e->watchdog_fd = e->epoll_fd = e->realtime.fd = e->boottime.fd = e->monotonic.fd = e->realtime_alarm.fd = e->boottime_alarm.fd = -1;
414 e->realtime.next = e->boottime.next = e->monotonic.next = e->realtime_alarm.next = e->boottime_alarm.next = USEC_INFINITY;
415 e->original_pid = getpid();
416 e->perturb = USEC_INFINITY;
418 assert_se(sigemptyset(&e->sigset) == 0);
420 e->pending = prioq_new(pending_prioq_compare);
426 e->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
427 if (e->epoll_fd < 0) {
440 _public_ sd_event* sd_event_ref(sd_event *e) {
441 assert_return(e, NULL);
443 assert(e->n_ref >= 1);
449 _public_ sd_event* sd_event_unref(sd_event *e) {
454 assert(e->n_ref >= 1);
463 static bool event_pid_changed(sd_event *e) {
466 /* We don't support people creating am event loop and keeping
467 * it around over a fork(). Let's complain. */
469 return e->original_pid != getpid();
472 static int source_io_unregister(sd_event_source *s) {
476 assert(s->type == SOURCE_IO);
478 if (!s->io.registered)
481 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, s->io.fd, NULL);
485 s->io.registered = false;
489 static int source_io_register(
494 struct epoll_event ev = {};
498 assert(s->type == SOURCE_IO);
499 assert(enabled != SD_EVENT_OFF);
504 if (enabled == SD_EVENT_ONESHOT)
505 ev.events |= EPOLLONESHOT;
507 if (s->io.registered)
508 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_MOD, s->io.fd, &ev);
510 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_ADD, s->io.fd, &ev);
515 s->io.registered = true;
520 static clockid_t event_source_type_to_clock(EventSourceType t) {
524 case SOURCE_TIME_REALTIME:
525 return CLOCK_REALTIME;
527 case SOURCE_TIME_BOOTTIME:
528 return CLOCK_BOOTTIME;
530 case SOURCE_TIME_MONOTONIC:
531 return CLOCK_MONOTONIC;
533 case SOURCE_TIME_REALTIME_ALARM:
534 return CLOCK_REALTIME_ALARM;
536 case SOURCE_TIME_BOOTTIME_ALARM:
537 return CLOCK_BOOTTIME_ALARM;
540 return (clockid_t) -1;
544 static EventSourceType clock_to_event_source_type(clockid_t clock) {
549 return SOURCE_TIME_REALTIME;
552 return SOURCE_TIME_BOOTTIME;
554 case CLOCK_MONOTONIC:
555 return SOURCE_TIME_MONOTONIC;
557 case CLOCK_REALTIME_ALARM:
558 return SOURCE_TIME_REALTIME_ALARM;
560 case CLOCK_BOOTTIME_ALARM:
561 return SOURCE_TIME_BOOTTIME_ALARM;
564 return _SOURCE_EVENT_SOURCE_TYPE_INVALID;
568 static struct clock_data* event_get_clock_data(sd_event *e, EventSourceType t) {
573 case SOURCE_TIME_REALTIME:
576 case SOURCE_TIME_BOOTTIME:
579 case SOURCE_TIME_MONOTONIC:
580 return &e->monotonic;
582 case SOURCE_TIME_REALTIME_ALARM:
583 return &e->realtime_alarm;
585 case SOURCE_TIME_BOOTTIME_ALARM:
586 return &e->boottime_alarm;
593 static bool need_signal(sd_event *e, int signal) {
594 return (e->signal_sources && e->signal_sources[signal] &&
595 e->signal_sources[signal]->enabled != SD_EVENT_OFF)
597 (signal == SIGCHLD &&
598 e->n_enabled_child_sources > 0);
601 static void source_disconnect(sd_event_source *s) {
609 assert(s->event->n_sources > 0);
615 source_io_unregister(s);
619 case SOURCE_TIME_REALTIME:
620 case SOURCE_TIME_BOOTTIME:
621 case SOURCE_TIME_MONOTONIC:
622 case SOURCE_TIME_REALTIME_ALARM:
623 case SOURCE_TIME_BOOTTIME_ALARM: {
624 struct clock_data *d;
626 d = event_get_clock_data(s->event, s->type);
629 prioq_remove(d->earliest, s, &s->time.earliest_index);
630 prioq_remove(d->latest, s, &s->time.latest_index);
631 d->needs_rearm = true;
636 if (s->signal.sig > 0) {
637 if (s->event->signal_sources)
638 s->event->signal_sources[s->signal.sig] = NULL;
640 /* If the signal was on and now it is off... */
641 if (s->enabled != SD_EVENT_OFF && !need_signal(s->event, s->signal.sig)) {
642 assert_se(sigdelset(&s->event->sigset, s->signal.sig) == 0);
649 if (s->child.pid > 0) {
650 if (s->enabled != SD_EVENT_OFF) {
651 assert(s->event->n_enabled_child_sources > 0);
652 s->event->n_enabled_child_sources--;
654 /* We know the signal was on, if it is off now... */
655 if (!need_signal(s->event, SIGCHLD)) {
656 assert_se(sigdelset(&s->event->sigset, SIGCHLD) == 0);
660 hashmap_remove(s->event->child_sources, INT_TO_PTR(s->child.pid));
670 set_remove(s->event->post_sources, s);
674 prioq_remove(s->event->exit, s, &s->exit.prioq_index);
678 assert_not_reached("Wut? I shouldn't exist.");
682 prioq_remove(s->event->pending, s, &s->pending_index);
685 prioq_remove(s->event->prepare, s, &s->prepare_index);
689 s->type = _SOURCE_EVENT_SOURCE_TYPE_INVALID;
691 LIST_REMOVE(sources, event->sources, s);
695 sd_event_unref(event);
698 static void source_free(sd_event_source *s) {
701 source_disconnect(s);
706 static int source_set_pending(sd_event_source *s, bool b) {
710 assert(s->type != SOURCE_EXIT);
718 s->pending_iteration = s->event->iteration;
720 r = prioq_put(s->event->pending, s, &s->pending_index);
726 assert_se(prioq_remove(s->event->pending, s, &s->pending_index));
728 if (EVENT_SOURCE_IS_TIME(s->type)) {
729 struct clock_data *d;
731 d = event_get_clock_data(s->event, s->type);
734 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
735 prioq_reshuffle(d->latest, s, &s->time.latest_index);
736 d->needs_rearm = true;
742 static sd_event_source *source_new(sd_event *e, bool floating, EventSourceType type) {
747 s = new0(sd_event_source, 1);
753 s->floating = floating;
755 s->pending_index = s->prepare_index = PRIOQ_IDX_NULL;
760 LIST_PREPEND(sources, e->sources, s);
766 _public_ int sd_event_add_io(
768 sd_event_source **ret,
771 sd_event_io_handler_t callback,
777 assert_return(e, -EINVAL);
778 assert_return(fd >= 0, -EINVAL);
779 assert_return(!(events & ~(EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET)), -EINVAL);
780 assert_return(callback, -EINVAL);
781 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
782 assert_return(!event_pid_changed(e), -ECHILD);
784 s = source_new(e, !ret, SOURCE_IO);
789 s->io.events = events;
790 s->io.callback = callback;
791 s->userdata = userdata;
792 s->enabled = SD_EVENT_ON;
794 r = source_io_register(s, s->enabled, events);
806 static void initialize_perturb(sd_event *e) {
807 sd_id128_t bootid = {};
809 /* When we sleep for longer, we try to realign the wakeup to
810 the same time wihtin each minute/second/250ms, so that
811 events all across the system can be coalesced into a single
812 CPU wakeup. However, let's take some system-specific
813 randomness for this value, so that in a network of systems
814 with synced clocks timer events are distributed a
815 bit. Here, we calculate a perturbation usec offset from the
818 if (_likely_(e->perturb != USEC_INFINITY))
821 if (sd_id128_get_boot(&bootid) >= 0)
822 e->perturb = (bootid.qwords[0] ^ bootid.qwords[1]) % USEC_PER_MINUTE;
825 static int event_setup_timer_fd(
827 struct clock_data *d,
830 struct epoll_event ev = {};
836 if (_likely_(d->fd >= 0))
839 fd = timerfd_create(clock, TFD_NONBLOCK|TFD_CLOEXEC);
844 ev.data.ptr = INT_TO_PTR(clock_to_event_source_type(clock));
846 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, fd, &ev);
856 _public_ int sd_event_add_time(
858 sd_event_source **ret,
862 sd_event_time_handler_t callback,
865 EventSourceType type;
867 struct clock_data *d;
870 assert_return(e, -EINVAL);
871 assert_return(usec != (uint64_t) -1, -EINVAL);
872 assert_return(accuracy != (uint64_t) -1, -EINVAL);
873 assert_return(callback, -EINVAL);
874 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
875 assert_return(!event_pid_changed(e), -ECHILD);
877 type = clock_to_event_source_type(clock);
878 assert_return(type >= 0, -ENOTSUP);
880 d = event_get_clock_data(e, type);
884 d->earliest = prioq_new(earliest_time_prioq_compare);
890 d->latest = prioq_new(latest_time_prioq_compare);
896 r = event_setup_timer_fd(e, d, clock);
901 s = source_new(e, !ret, type);
906 s->time.accuracy = accuracy == 0 ? DEFAULT_ACCURACY_USEC : accuracy;
907 s->time.callback = callback;
908 s->time.earliest_index = s->time.latest_index = PRIOQ_IDX_NULL;
909 s->userdata = userdata;
910 s->enabled = SD_EVENT_ONESHOT;
912 d->needs_rearm = true;
914 r = prioq_put(d->earliest, s, &s->time.earliest_index);
918 r = prioq_put(d->latest, s, &s->time.latest_index);
932 static int event_update_signal_fd(sd_event *e) {
933 struct epoll_event ev = {};
939 add_to_epoll = e->signal_fd < 0;
941 r = signalfd(e->signal_fd, &e->sigset, SFD_NONBLOCK|SFD_CLOEXEC);
951 ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
953 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->signal_fd, &ev);
955 e->signal_fd = safe_close(e->signal_fd);
962 static int signal_exit_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
965 return sd_event_exit(sd_event_source_get_event(s), PTR_TO_INT(userdata));
968 _public_ int sd_event_add_signal(
970 sd_event_source **ret,
972 sd_event_signal_handler_t callback,
980 assert_return(e, -EINVAL);
981 assert_return(sig > 0, -EINVAL);
982 assert_return(sig < _NSIG, -EINVAL);
983 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
984 assert_return(!event_pid_changed(e), -ECHILD);
987 callback = signal_exit_callback;
989 r = pthread_sigmask(SIG_SETMASK, NULL, &ss);
993 if (!sigismember(&ss, sig))
996 if (!e->signal_sources) {
997 e->signal_sources = new0(sd_event_source*, _NSIG);
998 if (!e->signal_sources)
1000 } else if (e->signal_sources[sig])
1003 previous = need_signal(e, sig);
1005 s = source_new(e, !ret, SOURCE_SIGNAL);
1009 s->signal.sig = sig;
1010 s->signal.callback = callback;
1011 s->userdata = userdata;
1012 s->enabled = SD_EVENT_ON;
1014 e->signal_sources[sig] = s;
1017 assert_se(sigaddset(&e->sigset, sig) == 0);
1019 r = event_update_signal_fd(e);
1032 _public_ int sd_event_add_child(
1034 sd_event_source **ret,
1037 sd_event_child_handler_t callback,
1044 assert_return(e, -EINVAL);
1045 assert_return(pid > 1, -EINVAL);
1046 assert_return(!(options & ~(WEXITED|WSTOPPED|WCONTINUED)), -EINVAL);
1047 assert_return(options != 0, -EINVAL);
1048 assert_return(callback, -EINVAL);
1049 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1050 assert_return(!event_pid_changed(e), -ECHILD);
1052 r = hashmap_ensure_allocated(&e->child_sources, NULL);
1056 if (hashmap_contains(e->child_sources, INT_TO_PTR(pid)))
1059 previous = need_signal(e, SIGCHLD);
1061 s = source_new(e, !ret, SOURCE_CHILD);
1066 s->child.options = options;
1067 s->child.callback = callback;
1068 s->userdata = userdata;
1069 s->enabled = SD_EVENT_ONESHOT;
1071 r = hashmap_put(e->child_sources, INT_TO_PTR(pid), s);
1077 e->n_enabled_child_sources ++;
1080 assert_se(sigaddset(&e->sigset, SIGCHLD) == 0);
1082 r = event_update_signal_fd(e);
1089 e->need_process_child = true;
1097 _public_ int sd_event_add_defer(
1099 sd_event_source **ret,
1100 sd_event_handler_t callback,
1106 assert_return(e, -EINVAL);
1107 assert_return(callback, -EINVAL);
1108 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1109 assert_return(!event_pid_changed(e), -ECHILD);
1111 s = source_new(e, !ret, SOURCE_DEFER);
1115 s->defer.callback = callback;
1116 s->userdata = userdata;
1117 s->enabled = SD_EVENT_ONESHOT;
1119 r = source_set_pending(s, true);
1131 _public_ int sd_event_add_post(
1133 sd_event_source **ret,
1134 sd_event_handler_t callback,
1140 assert_return(e, -EINVAL);
1141 assert_return(callback, -EINVAL);
1142 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1143 assert_return(!event_pid_changed(e), -ECHILD);
1145 r = set_ensure_allocated(&e->post_sources, NULL);
1149 s = source_new(e, !ret, SOURCE_POST);
1153 s->post.callback = callback;
1154 s->userdata = userdata;
1155 s->enabled = SD_EVENT_ON;
1157 r = set_put(e->post_sources, s);
1169 _public_ int sd_event_add_exit(
1171 sd_event_source **ret,
1172 sd_event_handler_t callback,
1178 assert_return(e, -EINVAL);
1179 assert_return(callback, -EINVAL);
1180 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1181 assert_return(!event_pid_changed(e), -ECHILD);
1184 e->exit = prioq_new(exit_prioq_compare);
1189 s = source_new(e, !ret, SOURCE_EXIT);
1193 s->exit.callback = callback;
1194 s->userdata = userdata;
1195 s->exit.prioq_index = PRIOQ_IDX_NULL;
1196 s->enabled = SD_EVENT_ONESHOT;
1198 r = prioq_put(s->event->exit, s, &s->exit.prioq_index);
1210 _public_ sd_event_source* sd_event_source_ref(sd_event_source *s) {
1211 assert_return(s, NULL);
1213 assert(s->n_ref >= 1);
1219 _public_ sd_event_source* sd_event_source_unref(sd_event_source *s) {
1224 assert(s->n_ref >= 1);
1227 if (s->n_ref <= 0) {
1228 /* Here's a special hack: when we are called from a
1229 * dispatch handler we won't free the event source
1230 * immediately, but we will detach the fd from the
1231 * epoll. This way it is safe for the caller to unref
1232 * the event source and immediately close the fd, but
1233 * we still retain a valid event source object after
1236 if (s->dispatching) {
1237 if (s->type == SOURCE_IO)
1238 source_io_unregister(s);
1240 source_disconnect(s);
1248 _public_ int sd_event_source_set_name(sd_event_source *s, const char *name) {
1249 assert_return(s, -EINVAL);
1251 return free_and_strdup(&s->name, name);
1254 _public_ int sd_event_source_get_name(sd_event_source *s, const char **name) {
1255 assert_return(s, -EINVAL);
1256 assert_return(name, -EINVAL);
1263 _public_ sd_event *sd_event_source_get_event(sd_event_source *s) {
1264 assert_return(s, NULL);
1269 _public_ int sd_event_source_get_pending(sd_event_source *s) {
1270 assert_return(s, -EINVAL);
1271 assert_return(s->type != SOURCE_EXIT, -EDOM);
1272 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1273 assert_return(!event_pid_changed(s->event), -ECHILD);
1278 _public_ int sd_event_source_get_io_fd(sd_event_source *s) {
1279 assert_return(s, -EINVAL);
1280 assert_return(s->type == SOURCE_IO, -EDOM);
1281 assert_return(!event_pid_changed(s->event), -ECHILD);
1286 _public_ int sd_event_source_set_io_fd(sd_event_source *s, int fd) {
1289 assert_return(s, -EINVAL);
1290 assert_return(fd >= 0, -EINVAL);
1291 assert_return(s->type == SOURCE_IO, -EDOM);
1292 assert_return(!event_pid_changed(s->event), -ECHILD);
1297 if (s->enabled == SD_EVENT_OFF) {
1299 s->io.registered = false;
1303 saved_fd = s->io.fd;
1304 assert(s->io.registered);
1307 s->io.registered = false;
1309 r = source_io_register(s, s->enabled, s->io.events);
1311 s->io.fd = saved_fd;
1312 s->io.registered = true;
1316 epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, saved_fd, NULL);
1322 _public_ int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events) {
1323 assert_return(s, -EINVAL);
1324 assert_return(events, -EINVAL);
1325 assert_return(s->type == SOURCE_IO, -EDOM);
1326 assert_return(!event_pid_changed(s->event), -ECHILD);
1328 *events = s->io.events;
1332 _public_ int sd_event_source_set_io_events(sd_event_source *s, uint32_t events) {
1335 assert_return(s, -EINVAL);
1336 assert_return(s->type == SOURCE_IO, -EDOM);
1337 assert_return(!(events & ~(EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET)), -EINVAL);
1338 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1339 assert_return(!event_pid_changed(s->event), -ECHILD);
1341 /* edge-triggered updates are never skipped, so we can reset edges */
1342 if (s->io.events == events && !(events & EPOLLET))
1345 if (s->enabled != SD_EVENT_OFF) {
1346 r = source_io_register(s, s->enabled, events);
1351 s->io.events = events;
1352 source_set_pending(s, false);
1357 _public_ int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents) {
1358 assert_return(s, -EINVAL);
1359 assert_return(revents, -EINVAL);
1360 assert_return(s->type == SOURCE_IO, -EDOM);
1361 assert_return(s->pending, -ENODATA);
1362 assert_return(!event_pid_changed(s->event), -ECHILD);
1364 *revents = s->io.revents;
1368 _public_ int sd_event_source_get_signal(sd_event_source *s) {
1369 assert_return(s, -EINVAL);
1370 assert_return(s->type == SOURCE_SIGNAL, -EDOM);
1371 assert_return(!event_pid_changed(s->event), -ECHILD);
1373 return s->signal.sig;
1376 _public_ int sd_event_source_get_priority(sd_event_source *s, int64_t *priority) {
1377 assert_return(s, -EINVAL);
1378 assert_return(!event_pid_changed(s->event), -ECHILD);
1383 _public_ int sd_event_source_set_priority(sd_event_source *s, int64_t priority) {
1384 assert_return(s, -EINVAL);
1385 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1386 assert_return(!event_pid_changed(s->event), -ECHILD);
1388 if (s->priority == priority)
1391 s->priority = priority;
1394 prioq_reshuffle(s->event->pending, s, &s->pending_index);
1397 prioq_reshuffle(s->event->prepare, s, &s->prepare_index);
1399 if (s->type == SOURCE_EXIT)
1400 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1405 _public_ int sd_event_source_get_enabled(sd_event_source *s, int *m) {
1406 assert_return(s, -EINVAL);
1407 assert_return(m, -EINVAL);
1408 assert_return(!event_pid_changed(s->event), -ECHILD);
1414 _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) {
1417 assert_return(s, -EINVAL);
1418 assert_return(m == SD_EVENT_OFF || m == SD_EVENT_ON || m == SD_EVENT_ONESHOT, -EINVAL);
1419 assert_return(!event_pid_changed(s->event), -ECHILD);
1421 /* If we are dead anyway, we are fine with turning off
1422 * sources, but everything else needs to fail. */
1423 if (s->event->state == SD_EVENT_FINISHED)
1424 return m == SD_EVENT_OFF ? 0 : -ESTALE;
1426 if (s->enabled == m)
1429 if (m == SD_EVENT_OFF) {
1434 r = source_io_unregister(s);
1441 case SOURCE_TIME_REALTIME:
1442 case SOURCE_TIME_BOOTTIME:
1443 case SOURCE_TIME_MONOTONIC:
1444 case SOURCE_TIME_REALTIME_ALARM:
1445 case SOURCE_TIME_BOOTTIME_ALARM: {
1446 struct clock_data *d;
1449 d = event_get_clock_data(s->event, s->type);
1452 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1453 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1454 d->needs_rearm = true;
1459 assert(need_signal(s->event, s->signal.sig));
1463 if (!need_signal(s->event, s->signal.sig)) {
1464 assert_se(sigdelset(&s->event->sigset, s->signal.sig) == 0);
1466 (void) event_update_signal_fd(s->event);
1467 /* If disabling failed, we might get a spurious event,
1468 * but otherwise nothing bad should happen. */
1474 assert(need_signal(s->event, SIGCHLD));
1478 assert(s->event->n_enabled_child_sources > 0);
1479 s->event->n_enabled_child_sources--;
1481 if (!need_signal(s->event, SIGCHLD)) {
1482 assert_se(sigdelset(&s->event->sigset, SIGCHLD) == 0);
1484 (void) event_update_signal_fd(s->event);
1491 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1500 assert_not_reached("Wut? I shouldn't exist.");
1507 r = source_io_register(s, m, s->io.events);
1514 case SOURCE_TIME_REALTIME:
1515 case SOURCE_TIME_BOOTTIME:
1516 case SOURCE_TIME_MONOTONIC:
1517 case SOURCE_TIME_REALTIME_ALARM:
1518 case SOURCE_TIME_BOOTTIME_ALARM: {
1519 struct clock_data *d;
1522 d = event_get_clock_data(s->event, s->type);
1525 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1526 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1527 d->needs_rearm = true;
1532 /* Check status before enabling. */
1533 if (!need_signal(s->event, s->signal.sig)) {
1534 assert_se(sigaddset(&s->event->sigset, s->signal.sig) == 0);
1536 r = event_update_signal_fd(s->event);
1538 s->enabled = SD_EVENT_OFF;
1547 /* Check status before enabling. */
1548 if (s->enabled == SD_EVENT_OFF) {
1549 if (!need_signal(s->event, SIGCHLD)) {
1550 assert_se(sigaddset(&s->event->sigset, s->signal.sig) == 0);
1552 r = event_update_signal_fd(s->event);
1554 s->enabled = SD_EVENT_OFF;
1559 s->event->n_enabled_child_sources++;
1567 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1576 assert_not_reached("Wut? I shouldn't exist.");
1581 prioq_reshuffle(s->event->pending, s, &s->pending_index);
1584 prioq_reshuffle(s->event->prepare, s, &s->prepare_index);
1589 _public_ int sd_event_source_get_time(sd_event_source *s, uint64_t *usec) {
1590 assert_return(s, -EINVAL);
1591 assert_return(usec, -EINVAL);
1592 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1593 assert_return(!event_pid_changed(s->event), -ECHILD);
1595 *usec = s->time.next;
1599 _public_ int sd_event_source_set_time(sd_event_source *s, uint64_t usec) {
1600 struct clock_data *d;
1602 assert_return(s, -EINVAL);
1603 assert_return(usec != (uint64_t) -1, -EINVAL);
1604 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1605 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1606 assert_return(!event_pid_changed(s->event), -ECHILD);
1608 s->time.next = usec;
1610 source_set_pending(s, false);
1612 d = event_get_clock_data(s->event, s->type);
1615 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1616 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1617 d->needs_rearm = true;
1622 _public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
1623 assert_return(s, -EINVAL);
1624 assert_return(usec, -EINVAL);
1625 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1626 assert_return(!event_pid_changed(s->event), -ECHILD);
1628 *usec = s->time.accuracy;
1632 _public_ int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec) {
1633 struct clock_data *d;
1635 assert_return(s, -EINVAL);
1636 assert_return(usec != (uint64_t) -1, -EINVAL);
1637 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1638 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1639 assert_return(!event_pid_changed(s->event), -ECHILD);
1642 usec = DEFAULT_ACCURACY_USEC;
1644 s->time.accuracy = usec;
1646 source_set_pending(s, false);
1648 d = event_get_clock_data(s->event, s->type);
1651 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1652 d->needs_rearm = true;
1657 _public_ int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock) {
1658 assert_return(s, -EINVAL);
1659 assert_return(clock, -EINVAL);
1660 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1661 assert_return(!event_pid_changed(s->event), -ECHILD);
1663 *clock = event_source_type_to_clock(s->type);
1667 _public_ int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid) {
1668 assert_return(s, -EINVAL);
1669 assert_return(pid, -EINVAL);
1670 assert_return(s->type == SOURCE_CHILD, -EDOM);
1671 assert_return(!event_pid_changed(s->event), -ECHILD);
1673 *pid = s->child.pid;
1677 _public_ int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback) {
1680 assert_return(s, -EINVAL);
1681 assert_return(s->type != SOURCE_EXIT, -EDOM);
1682 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1683 assert_return(!event_pid_changed(s->event), -ECHILD);
1685 if (s->prepare == callback)
1688 if (callback && s->prepare) {
1689 s->prepare = callback;
1693 r = prioq_ensure_allocated(&s->event->prepare, prepare_prioq_compare);
1697 s->prepare = callback;
1700 r = prioq_put(s->event->prepare, s, &s->prepare_index);
1704 prioq_remove(s->event->prepare, s, &s->prepare_index);
1709 _public_ void* sd_event_source_get_userdata(sd_event_source *s) {
1710 assert_return(s, NULL);
1715 _public_ void *sd_event_source_set_userdata(sd_event_source *s, void *userdata) {
1718 assert_return(s, NULL);
1721 s->userdata = userdata;
1726 static usec_t sleep_between(sd_event *e, usec_t a, usec_t b) {
1737 initialize_perturb(e);
1740 Find a good time to wake up again between times a and b. We
1741 have two goals here:
1743 a) We want to wake up as seldom as possible, hence prefer
1744 later times over earlier times.
1746 b) But if we have to wake up, then let's make sure to
1747 dispatch as much as possible on the entire system.
1749 We implement this by waking up everywhere at the same time
1750 within any given minute if we can, synchronised via the
1751 perturbation value determined from the boot ID. If we can't,
1752 then we try to find the same spot in every 10s, then 1s and
1753 then 250ms step. Otherwise, we pick the last possible time
1757 c = (b / USEC_PER_MINUTE) * USEC_PER_MINUTE + e->perturb;
1759 if (_unlikely_(c < USEC_PER_MINUTE))
1762 c -= USEC_PER_MINUTE;
1768 c = (b / (USEC_PER_SEC*10)) * (USEC_PER_SEC*10) + (e->perturb % (USEC_PER_SEC*10));
1770 if (_unlikely_(c < USEC_PER_SEC*10))
1773 c -= USEC_PER_SEC*10;
1779 c = (b / USEC_PER_SEC) * USEC_PER_SEC + (e->perturb % USEC_PER_SEC);
1781 if (_unlikely_(c < USEC_PER_SEC))
1790 c = (b / (USEC_PER_MSEC*250)) * (USEC_PER_MSEC*250) + (e->perturb % (USEC_PER_MSEC*250));
1792 if (_unlikely_(c < USEC_PER_MSEC*250))
1795 c -= USEC_PER_MSEC*250;
1804 static int event_arm_timer(
1806 struct clock_data *d) {
1808 struct itimerspec its = {};
1809 sd_event_source *a, *b;
1816 if (!d->needs_rearm)
1819 d->needs_rearm = false;
1821 a = prioq_peek(d->earliest);
1822 if (!a || a->enabled == SD_EVENT_OFF) {
1827 if (d->next == USEC_INFINITY)
1831 r = timerfd_settime(d->fd, TFD_TIMER_ABSTIME, &its, NULL);
1835 d->next = USEC_INFINITY;
1839 b = prioq_peek(d->latest);
1840 assert_se(b && b->enabled != SD_EVENT_OFF);
1842 t = sleep_between(e, a->time.next, b->time.next + b->time.accuracy);
1846 assert_se(d->fd >= 0);
1849 /* We don' want to disarm here, just mean some time looooong ago. */
1850 its.it_value.tv_sec = 0;
1851 its.it_value.tv_nsec = 1;
1853 timespec_store(&its.it_value, t);
1855 r = timerfd_settime(d->fd, TFD_TIMER_ABSTIME, &its, NULL);
1863 static int process_io(sd_event *e, sd_event_source *s, uint32_t revents) {
1866 assert(s->type == SOURCE_IO);
1868 /* If the event source was already pending, we just OR in the
1869 * new revents, otherwise we reset the value. The ORing is
1870 * necessary to handle EPOLLONESHOT events properly where
1871 * readability might happen independently of writability, and
1872 * we need to keep track of both */
1875 s->io.revents |= revents;
1877 s->io.revents = revents;
1879 return source_set_pending(s, true);
1882 static int flush_timer(sd_event *e, int fd, uint32_t events, usec_t *next) {
1889 assert_return(events == EPOLLIN, -EIO);
1891 ss = read(fd, &x, sizeof(x));
1893 if (errno == EAGAIN || errno == EINTR)
1899 if (_unlikely_(ss != sizeof(x)))
1903 *next = USEC_INFINITY;
1908 static int process_timer(
1911 struct clock_data *d) {
1920 s = prioq_peek(d->earliest);
1923 s->enabled == SD_EVENT_OFF ||
1927 r = source_set_pending(s, true);
1931 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1932 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1933 d->needs_rearm = true;
1939 static int process_child(sd_event *e) {
1946 e->need_process_child = false;
1949 So, this is ugly. We iteratively invoke waitid() with P_PID
1950 + WNOHANG for each PID we wait for, instead of using
1951 P_ALL. This is because we only want to get child
1952 information of very specific child processes, and not all
1953 of them. We might not have processed the SIGCHLD even of a
1954 previous invocation and we don't want to maintain a
1955 unbounded *per-child* event queue, hence we really don't
1956 want anything flushed out of the kernel's queue that we
1957 don't care about. Since this is O(n) this means that if you
1958 have a lot of processes you probably want to handle SIGCHLD
1961 We do not reap the children here (by using WNOWAIT), this
1962 is only done after the event source is dispatched so that
1963 the callback still sees the process as a zombie.
1966 HASHMAP_FOREACH(s, e->child_sources, i) {
1967 assert(s->type == SOURCE_CHILD);
1972 if (s->enabled == SD_EVENT_OFF)
1975 zero(s->child.siginfo);
1976 r = waitid(P_PID, s->child.pid, &s->child.siginfo,
1977 WNOHANG | (s->child.options & WEXITED ? WNOWAIT : 0) | s->child.options);
1981 if (s->child.siginfo.si_pid != 0) {
1983 s->child.siginfo.si_code == CLD_EXITED ||
1984 s->child.siginfo.si_code == CLD_KILLED ||
1985 s->child.siginfo.si_code == CLD_DUMPED;
1987 if (!zombie && (s->child.options & WEXITED)) {
1988 /* If the child isn't dead then let's
1989 * immediately remove the state change
1990 * from the queue, since there's no
1991 * benefit in leaving it queued */
1993 assert(s->child.options & (WSTOPPED|WCONTINUED));
1994 waitid(P_PID, s->child.pid, &s->child.siginfo, WNOHANG|(s->child.options & (WSTOPPED|WCONTINUED)));
1997 r = source_set_pending(s, true);
2006 static int process_signal(sd_event *e, uint32_t events) {
2007 bool read_one = false;
2012 assert_return(events == EPOLLIN, -EIO);
2015 struct signalfd_siginfo si;
2017 sd_event_source *s = NULL;
2019 n = read(e->signal_fd, &si, sizeof(si));
2021 if (errno == EAGAIN || errno == EINTR)
2027 if (_unlikely_(n != sizeof(si)))
2030 assert(si.ssi_signo < _NSIG);
2034 if (si.ssi_signo == SIGCHLD) {
2035 r = process_child(e);
2042 if (e->signal_sources)
2043 s = e->signal_sources[si.ssi_signo];
2048 s->signal.siginfo = si;
2049 r = source_set_pending(s, true);
2055 static int source_dispatch(sd_event_source *s) {
2059 assert(s->pending || s->type == SOURCE_EXIT);
2061 if (s->type != SOURCE_DEFER && s->type != SOURCE_EXIT) {
2062 r = source_set_pending(s, false);
2067 if (s->type != SOURCE_POST) {
2071 /* If we execute a non-post source, let's mark all
2072 * post sources as pending */
2074 SET_FOREACH(z, s->event->post_sources, i) {
2075 if (z->enabled == SD_EVENT_OFF)
2078 r = source_set_pending(z, true);
2084 if (s->enabled == SD_EVENT_ONESHOT) {
2085 r = sd_event_source_set_enabled(s, SD_EVENT_OFF);
2090 s->dispatching = true;
2095 r = s->io.callback(s, s->io.fd, s->io.revents, s->userdata);
2098 case SOURCE_TIME_REALTIME:
2099 case SOURCE_TIME_BOOTTIME:
2100 case SOURCE_TIME_MONOTONIC:
2101 case SOURCE_TIME_REALTIME_ALARM:
2102 case SOURCE_TIME_BOOTTIME_ALARM:
2103 r = s->time.callback(s, s->time.next, s->userdata);
2107 r = s->signal.callback(s, &s->signal.siginfo, s->userdata);
2110 case SOURCE_CHILD: {
2113 zombie = s->child.siginfo.si_code == CLD_EXITED ||
2114 s->child.siginfo.si_code == CLD_KILLED ||
2115 s->child.siginfo.si_code == CLD_DUMPED;
2117 r = s->child.callback(s, &s->child.siginfo, s->userdata);
2119 /* Now, reap the PID for good. */
2121 waitid(P_PID, s->child.pid, &s->child.siginfo, WNOHANG|WEXITED);
2127 r = s->defer.callback(s, s->userdata);
2131 r = s->post.callback(s, s->userdata);
2135 r = s->exit.callback(s, s->userdata);
2138 case SOURCE_WATCHDOG:
2139 case _SOURCE_EVENT_SOURCE_TYPE_MAX:
2140 case _SOURCE_EVENT_SOURCE_TYPE_INVALID:
2141 assert_not_reached("Wut? I shouldn't exist.");
2144 s->dispatching = false;
2148 log_debug("Event source '%s' returned error, disabling: %s", s->name, strerror(-r));
2150 log_debug("Event source %p returned error, disabling: %s", s, strerror(-r));
2156 sd_event_source_set_enabled(s, SD_EVENT_OFF);
2161 static int event_prepare(sd_event *e) {
2169 s = prioq_peek(e->prepare);
2170 if (!s || s->prepare_iteration == e->iteration || s->enabled == SD_EVENT_OFF)
2173 s->prepare_iteration = e->iteration;
2174 r = prioq_reshuffle(e->prepare, s, &s->prepare_index);
2180 s->dispatching = true;
2181 r = s->prepare(s, s->userdata);
2182 s->dispatching = false;
2186 log_debug("Prepare callback of event source '%s' returned error, disabling: %s", s->name, strerror(-r));
2188 log_debug("Prepare callback of event source %p returned error, disabling: %s", s, strerror(-r));
2194 sd_event_source_set_enabled(s, SD_EVENT_OFF);
2200 static int dispatch_exit(sd_event *e) {
2206 p = prioq_peek(e->exit);
2207 if (!p || p->enabled == SD_EVENT_OFF) {
2208 e->state = SD_EVENT_FINISHED;
2214 e->state = SD_EVENT_EXITING;
2216 r = source_dispatch(p);
2218 e->state = SD_EVENT_PASSIVE;
2224 static sd_event_source* event_next_pending(sd_event *e) {
2229 p = prioq_peek(e->pending);
2233 if (p->enabled == SD_EVENT_OFF)
2239 static int arm_watchdog(sd_event *e) {
2240 struct itimerspec its = {};
2245 assert(e->watchdog_fd >= 0);
2247 t = sleep_between(e,
2248 e->watchdog_last + (e->watchdog_period / 2),
2249 e->watchdog_last + (e->watchdog_period * 3 / 4));
2251 timespec_store(&its.it_value, t);
2253 /* Make sure we never set the watchdog to 0, which tells the
2254 * kernel to disable it. */
2255 if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0)
2256 its.it_value.tv_nsec = 1;
2258 r = timerfd_settime(e->watchdog_fd, TFD_TIMER_ABSTIME, &its, NULL);
2265 static int process_watchdog(sd_event *e) {
2271 /* Don't notify watchdog too often */
2272 if (e->watchdog_last + e->watchdog_period / 4 > e->timestamp.monotonic)
2275 sd_notify(false, "WATCHDOG=1");
2276 e->watchdog_last = e->timestamp.monotonic;
2278 return arm_watchdog(e);
2281 _public_ int sd_event_prepare(sd_event *e) {
2284 assert_return(e, -EINVAL);
2285 assert_return(!event_pid_changed(e), -ECHILD);
2286 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2287 assert_return(e->state == SD_EVENT_PASSIVE, -EBUSY);
2289 if (e->exit_requested)
2294 r = event_prepare(e);
2298 r = event_arm_timer(e, &e->realtime);
2302 r = event_arm_timer(e, &e->boottime);
2306 r = event_arm_timer(e, &e->monotonic);
2310 r = event_arm_timer(e, &e->realtime_alarm);
2314 r = event_arm_timer(e, &e->boottime_alarm);
2318 if (event_next_pending(e) || e->need_process_child)
2321 e->state = SD_EVENT_PREPARED;
2326 e->state = SD_EVENT_PREPARED;
2327 r = sd_event_wait(e, 0);
2329 e->state = SD_EVENT_PREPARED;
2334 _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
2335 struct epoll_event *ev_queue;
2336 unsigned ev_queue_max;
2339 assert_return(e, -EINVAL);
2340 assert_return(!event_pid_changed(e), -ECHILD);
2341 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2342 assert_return(e->state == SD_EVENT_PREPARED, -EBUSY);
2344 if (e->exit_requested) {
2345 e->state = SD_EVENT_PENDING;
2349 ev_queue_max = CLAMP(e->n_sources, 1U, EPOLL_QUEUE_MAX);
2350 ev_queue = newa(struct epoll_event, ev_queue_max);
2352 m = epoll_wait(e->epoll_fd, ev_queue, ev_queue_max,
2353 timeout == (uint64_t) -1 ? -1 : (int) ((timeout + USEC_PER_MSEC - 1) / USEC_PER_MSEC));
2355 if (errno == EINTR) {
2356 e->state = SD_EVENT_PENDING;
2365 dual_timestamp_get(&e->timestamp);
2366 e->timestamp_boottime = now(CLOCK_BOOTTIME);
2368 for (i = 0; i < m; i++) {
2370 if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_TIME_REALTIME))
2371 r = flush_timer(e, e->realtime.fd, ev_queue[i].events, &e->realtime.next);
2372 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_TIME_BOOTTIME))
2373 r = flush_timer(e, e->boottime.fd, ev_queue[i].events, &e->boottime.next);
2374 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_TIME_MONOTONIC))
2375 r = flush_timer(e, e->monotonic.fd, ev_queue[i].events, &e->monotonic.next);
2376 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_TIME_REALTIME_ALARM))
2377 r = flush_timer(e, e->realtime_alarm.fd, ev_queue[i].events, &e->realtime_alarm.next);
2378 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_TIME_BOOTTIME_ALARM))
2379 r = flush_timer(e, e->boottime_alarm.fd, ev_queue[i].events, &e->boottime_alarm.next);
2380 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_SIGNAL))
2381 r = process_signal(e, ev_queue[i].events);
2382 else if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_WATCHDOG))
2383 r = flush_timer(e, e->watchdog_fd, ev_queue[i].events, NULL);
2385 r = process_io(e, ev_queue[i].data.ptr, ev_queue[i].events);
2391 r = process_watchdog(e);
2395 r = process_timer(e, e->timestamp.realtime, &e->realtime);
2399 r = process_timer(e, e->timestamp_boottime, &e->boottime);
2403 r = process_timer(e, e->timestamp.monotonic, &e->monotonic);
2407 r = process_timer(e, e->timestamp.realtime, &e->realtime_alarm);
2411 r = process_timer(e, e->timestamp_boottime, &e->boottime_alarm);
2415 if (e->need_process_child) {
2416 r = process_child(e);
2421 if (event_next_pending(e)) {
2422 e->state = SD_EVENT_PENDING;
2430 e->state = SD_EVENT_PASSIVE;
2435 _public_ int sd_event_dispatch(sd_event *e) {
2439 assert_return(e, -EINVAL);
2440 assert_return(!event_pid_changed(e), -ECHILD);
2441 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2442 assert_return(e->state == SD_EVENT_PENDING, -EBUSY);
2444 if (e->exit_requested)
2445 return dispatch_exit(e);
2447 p = event_next_pending(e);
2451 e->state = SD_EVENT_RUNNING;
2452 r = source_dispatch(p);
2453 e->state = SD_EVENT_PASSIVE;
2460 e->state = SD_EVENT_PASSIVE;
2465 _public_ int sd_event_run(sd_event *e, uint64_t timeout) {
2468 assert_return(e, -EINVAL);
2469 assert_return(!event_pid_changed(e), -ECHILD);
2470 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2471 assert_return(e->state == SD_EVENT_PASSIVE, -EBUSY);
2473 r = sd_event_prepare(e);
2475 return sd_event_dispatch(e);
2479 r = sd_event_wait(e, timeout);
2481 return sd_event_dispatch(e);
2486 _public_ int sd_event_loop(sd_event *e) {
2489 assert_return(e, -EINVAL);
2490 assert_return(!event_pid_changed(e), -ECHILD);
2491 assert_return(e->state == SD_EVENT_PASSIVE, -EBUSY);
2495 while (e->state != SD_EVENT_FINISHED) {
2496 r = sd_event_run(e, (uint64_t) -1);
2508 _public_ int sd_event_get_fd(sd_event *e) {
2510 assert_return(e, -EINVAL);
2511 assert_return(!event_pid_changed(e), -ECHILD);
2516 _public_ int sd_event_get_state(sd_event *e) {
2517 assert_return(e, -EINVAL);
2518 assert_return(!event_pid_changed(e), -ECHILD);
2523 _public_ int sd_event_get_exit_code(sd_event *e, int *code) {
2524 assert_return(e, -EINVAL);
2525 assert_return(code, -EINVAL);
2526 assert_return(!event_pid_changed(e), -ECHILD);
2528 if (!e->exit_requested)
2531 *code = e->exit_code;
2535 _public_ int sd_event_exit(sd_event *e, int code) {
2536 assert_return(e, -EINVAL);
2537 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2538 assert_return(!event_pid_changed(e), -ECHILD);
2540 e->exit_requested = true;
2541 e->exit_code = code;
2546 _public_ int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec) {
2547 assert_return(e, -EINVAL);
2548 assert_return(usec, -EINVAL);
2549 assert_return(!event_pid_changed(e), -ECHILD);
2551 /* If we haven't run yet, just get the actual time */
2552 if (!dual_timestamp_is_set(&e->timestamp))
2557 case CLOCK_REALTIME:
2558 case CLOCK_REALTIME_ALARM:
2559 *usec = e->timestamp.realtime;
2562 case CLOCK_MONOTONIC:
2563 *usec = e->timestamp.monotonic;
2566 case CLOCK_BOOTTIME:
2567 case CLOCK_BOOTTIME_ALARM:
2568 *usec = e->timestamp_boottime;
2575 _public_ int sd_event_default(sd_event **ret) {
2577 static thread_local sd_event *default_event = NULL;
2582 return !!default_event;
2584 if (default_event) {
2585 *ret = sd_event_ref(default_event);
2589 r = sd_event_new(&e);
2593 e->default_event_ptr = &default_event;
2601 _public_ int sd_event_get_tid(sd_event *e, pid_t *tid) {
2602 assert_return(e, -EINVAL);
2603 assert_return(tid, -EINVAL);
2604 assert_return(!event_pid_changed(e), -ECHILD);
2614 _public_ int sd_event_set_watchdog(sd_event *e, int b) {
2617 assert_return(e, -EINVAL);
2618 assert_return(!event_pid_changed(e), -ECHILD);
2620 if (e->watchdog == !!b)
2624 struct epoll_event ev = {};
2626 r = sd_watchdog_enabled(false, &e->watchdog_period);
2630 /* Issue first ping immediately */
2631 sd_notify(false, "WATCHDOG=1");
2632 e->watchdog_last = now(CLOCK_MONOTONIC);
2634 e->watchdog_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
2635 if (e->watchdog_fd < 0)
2638 r = arm_watchdog(e);
2642 ev.events = EPOLLIN;
2643 ev.data.ptr = INT_TO_PTR(SOURCE_WATCHDOG);
2645 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->watchdog_fd, &ev);
2652 if (e->watchdog_fd >= 0) {
2653 epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, e->watchdog_fd, NULL);
2654 e->watchdog_fd = safe_close(e->watchdog_fd);
2662 e->watchdog_fd = safe_close(e->watchdog_fd);
2666 _public_ int sd_event_get_watchdog(sd_event *e) {
2667 assert_return(e, -EINVAL);
2668 assert_return(!event_pid_changed(e), -ECHILD);