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>
27 #include "sd-daemon.h"
32 #include "time-util.h"
36 #include "signal-util.h"
40 #define DEFAULT_ACCURACY_USEC (250 * USEC_PER_MSEC)
42 typedef enum EventSourceType {
46 SOURCE_TIME_MONOTONIC,
47 SOURCE_TIME_REALTIME_ALARM,
48 SOURCE_TIME_BOOTTIME_ALARM,
55 _SOURCE_EVENT_SOURCE_TYPE_MAX,
56 _SOURCE_EVENT_SOURCE_TYPE_INVALID = -1
59 /* All objects we use in epoll events start with this value, so that
60 * we know how to dispatch it */
61 typedef enum WakeupType {
67 _WAKEUP_TYPE_INVALID = -1,
70 #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)
72 struct sd_event_source {
79 sd_event_handler_t prepare;
83 EventSourceType type:5;
90 unsigned pending_index;
91 unsigned prepare_index;
92 unsigned pending_iteration;
93 unsigned prepare_iteration;
95 LIST_FIELDS(sd_event_source, sources);
99 sd_event_io_handler_t callback;
106 sd_event_time_handler_t callback;
107 usec_t next, accuracy;
108 unsigned earliest_index;
109 unsigned latest_index;
112 sd_event_signal_handler_t callback;
113 struct signalfd_siginfo siginfo;
117 sd_event_child_handler_t callback;
123 sd_event_handler_t callback;
126 sd_event_handler_t callback;
129 sd_event_handler_t callback;
130 unsigned prioq_index;
139 /* For all clocks we maintain two priority queues each, one
140 * ordered for the earliest times the events may be
141 * dispatched, and one ordered by the latest times they must
142 * have been dispatched. The range between the top entries in
143 * the two prioqs is the time window we can freely schedule
156 /* For each priority we maintain one signal fd, so that we
157 * only have to dequeue a single event per priority at a
163 sd_event_source *current;
175 /* timerfd_create() only supports these five clocks so far. We
176 * can add support for more clocks when the kernel learns to
177 * deal with them, too. */
178 struct clock_data realtime;
179 struct clock_data boottime;
180 struct clock_data monotonic;
181 struct clock_data realtime_alarm;
182 struct clock_data boottime_alarm;
186 sd_event_source **signal_sources; /* indexed by signal number */
187 Hashmap *signal_data; /* indexed by priority */
189 Hashmap *child_sources;
190 unsigned n_enabled_child_sources;
199 dual_timestamp timestamp;
200 usec_t timestamp_boottime;
203 bool exit_requested:1;
204 bool need_process_child:1;
210 sd_event **default_event_ptr;
212 usec_t watchdog_last, watchdog_period;
216 LIST_HEAD(sd_event_source, sources);
219 static void source_disconnect(sd_event_source *s);
221 static int pending_prioq_compare(const void *a, const void *b) {
222 const sd_event_source *x = a, *y = b;
227 /* Enabled ones first */
228 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
230 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
233 /* Lower priority values first */
234 if (x->priority < y->priority)
236 if (x->priority > y->priority)
239 /* Older entries first */
240 if (x->pending_iteration < y->pending_iteration)
242 if (x->pending_iteration > y->pending_iteration)
248 static int prepare_prioq_compare(const void *a, const void *b) {
249 const sd_event_source *x = a, *y = b;
254 /* Enabled ones first */
255 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
257 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
260 /* Move most recently prepared ones last, so that we can stop
261 * preparing as soon as we hit one that has already been
262 * prepared in the current iteration */
263 if (x->prepare_iteration < y->prepare_iteration)
265 if (x->prepare_iteration > y->prepare_iteration)
268 /* Lower priority values first */
269 if (x->priority < y->priority)
271 if (x->priority > y->priority)
277 static int earliest_time_prioq_compare(const void *a, const void *b) {
278 const sd_event_source *x = a, *y = b;
280 assert(EVENT_SOURCE_IS_TIME(x->type));
281 assert(x->type == y->type);
283 /* Enabled ones first */
284 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
286 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
289 /* Move the pending ones to the end */
290 if (!x->pending && y->pending)
292 if (x->pending && !y->pending)
296 if (x->time.next < y->time.next)
298 if (x->time.next > y->time.next)
304 static int latest_time_prioq_compare(const void *a, const void *b) {
305 const sd_event_source *x = a, *y = b;
307 assert(EVENT_SOURCE_IS_TIME(x->type));
308 assert(x->type == y->type);
310 /* Enabled ones first */
311 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
313 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
316 /* Move the pending ones to the end */
317 if (!x->pending && y->pending)
319 if (x->pending && !y->pending)
323 if (x->time.next + x->time.accuracy < y->time.next + y->time.accuracy)
325 if (x->time.next + x->time.accuracy > y->time.next + y->time.accuracy)
331 static int exit_prioq_compare(const void *a, const void *b) {
332 const sd_event_source *x = a, *y = b;
334 assert(x->type == SOURCE_EXIT);
335 assert(y->type == SOURCE_EXIT);
337 /* Enabled ones first */
338 if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
340 if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
343 /* Lower priority values first */
344 if (x->priority < y->priority)
346 if (x->priority > y->priority)
352 static void free_clock_data(struct clock_data *d) {
354 assert(d->wakeup == WAKEUP_CLOCK_DATA);
357 prioq_free(d->earliest);
358 prioq_free(d->latest);
361 static void event_free(sd_event *e) {
366 while ((s = e->sources)) {
368 source_disconnect(s);
369 sd_event_source_unref(s);
372 assert(e->n_sources == 0);
374 if (e->default_event_ptr)
375 *(e->default_event_ptr) = NULL;
377 safe_close(e->epoll_fd);
378 safe_close(e->watchdog_fd);
380 free_clock_data(&e->realtime);
381 free_clock_data(&e->boottime);
382 free_clock_data(&e->monotonic);
383 free_clock_data(&e->realtime_alarm);
384 free_clock_data(&e->boottime_alarm);
386 prioq_free(e->pending);
387 prioq_free(e->prepare);
390 free(e->signal_sources);
391 hashmap_free(e->signal_data);
393 hashmap_free(e->child_sources);
394 set_free(e->post_sources);
398 _public_ int sd_event_new(sd_event** ret) {
402 assert_return(ret, -EINVAL);
404 e = new0(sd_event, 1);
409 e->watchdog_fd = e->epoll_fd = e->realtime.fd = e->boottime.fd = e->monotonic.fd = e->realtime_alarm.fd = e->boottime_alarm.fd = -1;
410 e->realtime.next = e->boottime.next = e->monotonic.next = e->realtime_alarm.next = e->boottime_alarm.next = USEC_INFINITY;
411 e->realtime.wakeup = e->boottime.wakeup = e->monotonic.wakeup = e->realtime_alarm.wakeup = e->boottime_alarm.wakeup = WAKEUP_CLOCK_DATA;
412 e->original_pid = getpid();
413 e->perturb = USEC_INFINITY;
415 e->pending = prioq_new(pending_prioq_compare);
421 e->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
422 if (e->epoll_fd < 0) {
435 _public_ sd_event* sd_event_ref(sd_event *e) {
436 assert_return(e, NULL);
438 assert(e->n_ref >= 1);
444 _public_ sd_event* sd_event_unref(sd_event *e) {
449 assert(e->n_ref >= 1);
458 static bool event_pid_changed(sd_event *e) {
461 /* We don't support people creating an event loop and keeping
462 * it around over a fork(). Let's complain. */
464 return e->original_pid != getpid();
467 static void source_io_unregister(sd_event_source *s) {
471 assert(s->type == SOURCE_IO);
473 if (event_pid_changed(s->event))
476 if (!s->io.registered)
479 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, s->io.fd, NULL);
481 log_debug_errno(errno, "Failed to remove source %s from epoll: %m", strna(s->description));
483 s->io.registered = false;
486 static int source_io_register(
491 struct epoll_event ev = {};
495 assert(s->type == SOURCE_IO);
496 assert(enabled != SD_EVENT_OFF);
501 if (enabled == SD_EVENT_ONESHOT)
502 ev.events |= EPOLLONESHOT;
504 if (s->io.registered)
505 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_MOD, s->io.fd, &ev);
507 r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_ADD, s->io.fd, &ev);
511 s->io.registered = true;
516 /// UNNEEDED by elogind
518 static clockid_t event_source_type_to_clock(EventSourceType t) {
522 case SOURCE_TIME_REALTIME:
523 return CLOCK_REALTIME;
525 case SOURCE_TIME_BOOTTIME:
526 return CLOCK_BOOTTIME;
528 case SOURCE_TIME_MONOTONIC:
529 return CLOCK_MONOTONIC;
531 case SOURCE_TIME_REALTIME_ALARM:
532 return CLOCK_REALTIME_ALARM;
534 case SOURCE_TIME_BOOTTIME_ALARM:
535 return CLOCK_BOOTTIME_ALARM;
538 return (clockid_t) -1;
543 static EventSourceType clock_to_event_source_type(clockid_t clock) {
548 return SOURCE_TIME_REALTIME;
551 return SOURCE_TIME_BOOTTIME;
553 case CLOCK_MONOTONIC:
554 return SOURCE_TIME_MONOTONIC;
556 case CLOCK_REALTIME_ALARM:
557 return SOURCE_TIME_REALTIME_ALARM;
559 case CLOCK_BOOTTIME_ALARM:
560 return SOURCE_TIME_BOOTTIME_ALARM;
563 return _SOURCE_EVENT_SOURCE_TYPE_INVALID;
567 static struct clock_data* event_get_clock_data(sd_event *e, EventSourceType t) {
572 case SOURCE_TIME_REALTIME:
575 case SOURCE_TIME_BOOTTIME:
578 case SOURCE_TIME_MONOTONIC:
579 return &e->monotonic;
581 case SOURCE_TIME_REALTIME_ALARM:
582 return &e->realtime_alarm;
584 case SOURCE_TIME_BOOTTIME_ALARM:
585 return &e->boottime_alarm;
592 static int event_make_signal_data(
595 struct signal_data **ret) {
597 struct epoll_event ev = {};
598 struct signal_data *d;
606 if (event_pid_changed(e))
609 if (e->signal_sources && e->signal_sources[sig])
610 priority = e->signal_sources[sig]->priority;
614 d = hashmap_get(e->signal_data, &priority);
616 if (sigismember(&d->sigset, sig) > 0) {
622 r = hashmap_ensure_allocated(&e->signal_data, &uint64_hash_ops);
626 d = new0(struct signal_data, 1);
630 d->wakeup = WAKEUP_SIGNAL_DATA;
632 d->priority = priority;
634 r = hashmap_put(e->signal_data, &d->priority, d);
642 assert_se(sigaddset(&ss_copy, sig) >= 0);
644 r = signalfd(d->fd, &ss_copy, SFD_NONBLOCK|SFD_CLOEXEC);
663 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, d->fd, &ev);
676 d->fd = safe_close(d->fd);
677 hashmap_remove(e->signal_data, &d->priority);
684 static void event_unmask_signal_data(sd_event *e, struct signal_data *d, int sig) {
688 /* Turns off the specified signal in the signal data
689 * object. If the signal mask of the object becomes empty that
692 if (sigismember(&d->sigset, sig) == 0)
695 assert_se(sigdelset(&d->sigset, sig) >= 0);
697 if (sigisemptyset(&d->sigset)) {
699 /* If all the mask is all-zero we can get rid of the structure */
700 hashmap_remove(e->signal_data, &d->priority);
709 if (signalfd(d->fd, &d->sigset, SFD_NONBLOCK|SFD_CLOEXEC) < 0)
710 log_debug_errno(errno, "Failed to unset signal bit, ignoring: %m");
713 static void event_gc_signal_data(sd_event *e, const int64_t *priority, int sig) {
714 struct signal_data *d;
715 static const int64_t zero_priority = 0;
719 /* Rechecks if the specified signal is still something we are
720 * interested in. If not, we'll unmask it, and possibly drop
721 * the signalfd for it. */
723 if (sig == SIGCHLD &&
724 e->n_enabled_child_sources > 0)
727 if (e->signal_sources &&
728 e->signal_sources[sig] &&
729 e->signal_sources[sig]->enabled != SD_EVENT_OFF)
733 * The specified signal might be enabled in three different queues:
735 * 1) the one that belongs to the priority passed (if it is non-NULL)
736 * 2) the one that belongs to the priority of the event source of the signal (if there is one)
737 * 3) the 0 priority (to cover the SIGCHLD case)
739 * Hence, let's remove it from all three here.
743 d = hashmap_get(e->signal_data, priority);
745 event_unmask_signal_data(e, d, sig);
748 if (e->signal_sources && e->signal_sources[sig]) {
749 d = hashmap_get(e->signal_data, &e->signal_sources[sig]->priority);
751 event_unmask_signal_data(e, d, sig);
754 d = hashmap_get(e->signal_data, &zero_priority);
756 event_unmask_signal_data(e, d, sig);
759 static void source_disconnect(sd_event_source *s) {
767 assert(s->event->n_sources > 0);
773 source_io_unregister(s);
777 case SOURCE_TIME_REALTIME:
778 case SOURCE_TIME_BOOTTIME:
779 case SOURCE_TIME_MONOTONIC:
780 case SOURCE_TIME_REALTIME_ALARM:
781 case SOURCE_TIME_BOOTTIME_ALARM: {
782 struct clock_data *d;
784 d = event_get_clock_data(s->event, s->type);
787 prioq_remove(d->earliest, s, &s->time.earliest_index);
788 prioq_remove(d->latest, s, &s->time.latest_index);
789 d->needs_rearm = true;
794 if (s->signal.sig > 0) {
796 if (s->event->signal_sources)
797 s->event->signal_sources[s->signal.sig] = NULL;
799 event_gc_signal_data(s->event, &s->priority, s->signal.sig);
805 if (s->child.pid > 0) {
806 if (s->enabled != SD_EVENT_OFF) {
807 assert(s->event->n_enabled_child_sources > 0);
808 s->event->n_enabled_child_sources--;
811 (void) hashmap_remove(s->event->child_sources, INT_TO_PTR(s->child.pid));
812 event_gc_signal_data(s->event, &s->priority, SIGCHLD);
822 set_remove(s->event->post_sources, s);
826 prioq_remove(s->event->exit, s, &s->exit.prioq_index);
830 assert_not_reached("Wut? I shouldn't exist.");
834 prioq_remove(s->event->pending, s, &s->pending_index);
837 prioq_remove(s->event->prepare, s, &s->prepare_index);
841 s->type = _SOURCE_EVENT_SOURCE_TYPE_INVALID;
843 LIST_REMOVE(sources, event->sources, s);
847 sd_event_unref(event);
850 static void source_free(sd_event_source *s) {
853 source_disconnect(s);
854 free(s->description);
858 static int source_set_pending(sd_event_source *s, bool b) {
862 assert(s->type != SOURCE_EXIT);
870 s->pending_iteration = s->event->iteration;
872 r = prioq_put(s->event->pending, s, &s->pending_index);
878 assert_se(prioq_remove(s->event->pending, s, &s->pending_index));
880 if (EVENT_SOURCE_IS_TIME(s->type)) {
881 struct clock_data *d;
883 d = event_get_clock_data(s->event, s->type);
886 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
887 prioq_reshuffle(d->latest, s, &s->time.latest_index);
888 d->needs_rearm = true;
891 if (s->type == SOURCE_SIGNAL && !b) {
892 struct signal_data *d;
894 d = hashmap_get(s->event->signal_data, &s->priority);
895 if (d && d->current == s)
902 static sd_event_source *source_new(sd_event *e, bool floating, EventSourceType type) {
907 s = new0(sd_event_source, 1);
913 s->floating = floating;
915 s->pending_index = s->prepare_index = PRIOQ_IDX_NULL;
920 LIST_PREPEND(sources, e->sources, s);
926 _public_ int sd_event_add_io(
928 sd_event_source **ret,
931 sd_event_io_handler_t callback,
937 assert_return(e, -EINVAL);
938 assert_return(fd >= 0, -EBADF);
939 assert_return(!(events & ~(EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET)), -EINVAL);
940 assert_return(callback, -EINVAL);
941 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
942 assert_return(!event_pid_changed(e), -ECHILD);
944 s = source_new(e, !ret, SOURCE_IO);
948 s->wakeup = WAKEUP_EVENT_SOURCE;
950 s->io.events = events;
951 s->io.callback = callback;
952 s->userdata = userdata;
953 s->enabled = SD_EVENT_ON;
955 r = source_io_register(s, s->enabled, events);
967 static void initialize_perturb(sd_event *e) {
968 sd_id128_t bootid = {};
970 /* When we sleep for longer, we try to realign the wakeup to
971 the same time wihtin each minute/second/250ms, so that
972 events all across the system can be coalesced into a single
973 CPU wakeup. However, let's take some system-specific
974 randomness for this value, so that in a network of systems
975 with synced clocks timer events are distributed a
976 bit. Here, we calculate a perturbation usec offset from the
979 if (_likely_(e->perturb != USEC_INFINITY))
982 if (sd_id128_get_boot(&bootid) >= 0)
983 e->perturb = (bootid.qwords[0] ^ bootid.qwords[1]) % USEC_PER_MINUTE;
986 static int event_setup_timer_fd(
988 struct clock_data *d,
991 struct epoll_event ev = {};
997 if (_likely_(d->fd >= 0))
1000 fd = timerfd_create(clock, TFD_NONBLOCK|TFD_CLOEXEC);
1004 ev.events = EPOLLIN;
1007 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, fd, &ev);
1017 static int time_exit_callback(sd_event_source *s, uint64_t usec, void *userdata) {
1020 return sd_event_exit(sd_event_source_get_event(s), PTR_TO_INT(userdata));
1023 _public_ int sd_event_add_time(
1025 sd_event_source **ret,
1029 sd_event_time_handler_t callback,
1032 EventSourceType type;
1034 struct clock_data *d;
1037 assert_return(e, -EINVAL);
1038 assert_return(usec != (uint64_t) -1, -EINVAL);
1039 assert_return(accuracy != (uint64_t) -1, -EINVAL);
1040 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1041 assert_return(!event_pid_changed(e), -ECHILD);
1044 callback = time_exit_callback;
1046 type = clock_to_event_source_type(clock);
1047 assert_return(type >= 0, -EOPNOTSUPP);
1049 d = event_get_clock_data(e, type);
1053 d->earliest = prioq_new(earliest_time_prioq_compare);
1059 d->latest = prioq_new(latest_time_prioq_compare);
1065 r = event_setup_timer_fd(e, d, clock);
1070 s = source_new(e, !ret, type);
1074 s->time.next = usec;
1075 s->time.accuracy = accuracy == 0 ? DEFAULT_ACCURACY_USEC : accuracy;
1076 s->time.callback = callback;
1077 s->time.earliest_index = s->time.latest_index = PRIOQ_IDX_NULL;
1078 s->userdata = userdata;
1079 s->enabled = SD_EVENT_ONESHOT;
1081 d->needs_rearm = true;
1083 r = prioq_put(d->earliest, s, &s->time.earliest_index);
1087 r = prioq_put(d->latest, s, &s->time.latest_index);
1101 static int signal_exit_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
1104 return sd_event_exit(sd_event_source_get_event(s), PTR_TO_INT(userdata));
1107 _public_ int sd_event_add_signal(
1109 sd_event_source **ret,
1111 sd_event_signal_handler_t callback,
1115 struct signal_data *d;
1119 assert_return(e, -EINVAL);
1120 assert_return(sig > 0, -EINVAL);
1121 assert_return(sig < _NSIG, -EINVAL);
1122 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1123 assert_return(!event_pid_changed(e), -ECHILD);
1126 callback = signal_exit_callback;
1128 r = pthread_sigmask(SIG_SETMASK, NULL, &ss);
1132 if (!sigismember(&ss, sig))
1135 if (!e->signal_sources) {
1136 e->signal_sources = new0(sd_event_source*, _NSIG);
1137 if (!e->signal_sources)
1139 } else if (e->signal_sources[sig])
1142 s = source_new(e, !ret, SOURCE_SIGNAL);
1146 s->signal.sig = sig;
1147 s->signal.callback = callback;
1148 s->userdata = userdata;
1149 s->enabled = SD_EVENT_ON;
1151 e->signal_sources[sig] = s;
1153 r = event_make_signal_data(e, sig, &d);
1159 /* Use the signal name as description for the event source by default */
1160 (void) sd_event_source_set_description(s, signal_to_string(sig));
1168 _public_ int sd_event_add_child(
1170 sd_event_source **ret,
1173 sd_event_child_handler_t callback,
1179 assert_return(e, -EINVAL);
1180 assert_return(pid > 1, -EINVAL);
1181 assert_return(!(options & ~(WEXITED|WSTOPPED|WCONTINUED)), -EINVAL);
1182 assert_return(options != 0, -EINVAL);
1183 assert_return(callback, -EINVAL);
1184 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1185 assert_return(!event_pid_changed(e), -ECHILD);
1187 r = hashmap_ensure_allocated(&e->child_sources, NULL);
1191 if (hashmap_contains(e->child_sources, INT_TO_PTR(pid)))
1194 s = source_new(e, !ret, SOURCE_CHILD);
1199 s->child.options = options;
1200 s->child.callback = callback;
1201 s->userdata = userdata;
1202 s->enabled = SD_EVENT_ONESHOT;
1204 r = hashmap_put(e->child_sources, INT_TO_PTR(pid), s);
1210 e->n_enabled_child_sources ++;
1212 r = event_make_signal_data(e, SIGCHLD, NULL);
1214 e->n_enabled_child_sources--;
1219 e->need_process_child = true;
1227 _public_ int sd_event_add_defer(
1229 sd_event_source **ret,
1230 sd_event_handler_t callback,
1236 assert_return(e, -EINVAL);
1237 assert_return(callback, -EINVAL);
1238 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1239 assert_return(!event_pid_changed(e), -ECHILD);
1241 s = source_new(e, !ret, SOURCE_DEFER);
1245 s->defer.callback = callback;
1246 s->userdata = userdata;
1247 s->enabled = SD_EVENT_ONESHOT;
1249 r = source_set_pending(s, true);
1261 _public_ int sd_event_add_post(
1263 sd_event_source **ret,
1264 sd_event_handler_t callback,
1270 assert_return(e, -EINVAL);
1271 assert_return(callback, -EINVAL);
1272 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1273 assert_return(!event_pid_changed(e), -ECHILD);
1275 r = set_ensure_allocated(&e->post_sources, NULL);
1279 s = source_new(e, !ret, SOURCE_POST);
1283 s->post.callback = callback;
1284 s->userdata = userdata;
1285 s->enabled = SD_EVENT_ON;
1287 r = set_put(e->post_sources, s);
1299 _public_ int sd_event_add_exit(
1301 sd_event_source **ret,
1302 sd_event_handler_t callback,
1308 assert_return(e, -EINVAL);
1309 assert_return(callback, -EINVAL);
1310 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
1311 assert_return(!event_pid_changed(e), -ECHILD);
1314 e->exit = prioq_new(exit_prioq_compare);
1319 s = source_new(e, !ret, SOURCE_EXIT);
1323 s->exit.callback = callback;
1324 s->userdata = userdata;
1325 s->exit.prioq_index = PRIOQ_IDX_NULL;
1326 s->enabled = SD_EVENT_ONESHOT;
1328 r = prioq_put(s->event->exit, s, &s->exit.prioq_index);
1340 /// UNNEEDED by elogind
1342 _public_ sd_event_source* sd_event_source_ref(sd_event_source *s) {
1343 assert_return(s, NULL);
1345 assert(s->n_ref >= 1);
1352 _public_ sd_event_source* sd_event_source_unref(sd_event_source *s) {
1357 assert(s->n_ref >= 1);
1360 if (s->n_ref <= 0) {
1361 /* Here's a special hack: when we are called from a
1362 * dispatch handler we won't free the event source
1363 * immediately, but we will detach the fd from the
1364 * epoll. This way it is safe for the caller to unref
1365 * the event source and immediately close the fd, but
1366 * we still retain a valid event source object after
1369 if (s->dispatching) {
1370 if (s->type == SOURCE_IO)
1371 source_io_unregister(s);
1373 source_disconnect(s);
1381 _public_ int sd_event_source_set_description(sd_event_source *s, const char *description) {
1382 assert_return(s, -EINVAL);
1383 assert_return(!event_pid_changed(s->event), -ECHILD);
1385 return free_and_strdup(&s->description, description);
1388 /// UNNEEDED by elogind
1390 _public_ int sd_event_source_get_description(sd_event_source *s, const char **description) {
1391 assert_return(s, -EINVAL);
1392 assert_return(description, -EINVAL);
1393 assert_return(s->description, -ENXIO);
1394 assert_return(!event_pid_changed(s->event), -ECHILD);
1396 *description = s->description;
1401 _public_ sd_event *sd_event_source_get_event(sd_event_source *s) {
1402 assert_return(s, NULL);
1407 /// UNNEEDED by elogind
1409 _public_ int sd_event_source_get_pending(sd_event_source *s) {
1410 assert_return(s, -EINVAL);
1411 assert_return(s->type != SOURCE_EXIT, -EDOM);
1412 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1413 assert_return(!event_pid_changed(s->event), -ECHILD);
1418 _public_ int sd_event_source_get_io_fd(sd_event_source *s) {
1419 assert_return(s, -EINVAL);
1420 assert_return(s->type == SOURCE_IO, -EDOM);
1421 assert_return(!event_pid_changed(s->event), -ECHILD);
1427 _public_ int sd_event_source_set_io_fd(sd_event_source *s, int fd) {
1430 assert_return(s, -EINVAL);
1431 assert_return(fd >= 0, -EBADF);
1432 assert_return(s->type == SOURCE_IO, -EDOM);
1433 assert_return(!event_pid_changed(s->event), -ECHILD);
1438 if (s->enabled == SD_EVENT_OFF) {
1440 s->io.registered = false;
1444 saved_fd = s->io.fd;
1445 assert(s->io.registered);
1448 s->io.registered = false;
1450 r = source_io_register(s, s->enabled, s->io.events);
1452 s->io.fd = saved_fd;
1453 s->io.registered = true;
1457 epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, saved_fd, NULL);
1463 /// UNNEEDED by elogind
1465 _public_ int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events) {
1466 assert_return(s, -EINVAL);
1467 assert_return(events, -EINVAL);
1468 assert_return(s->type == SOURCE_IO, -EDOM);
1469 assert_return(!event_pid_changed(s->event), -ECHILD);
1471 *events = s->io.events;
1476 _public_ int sd_event_source_set_io_events(sd_event_source *s, uint32_t events) {
1479 assert_return(s, -EINVAL);
1480 assert_return(s->type == SOURCE_IO, -EDOM);
1481 assert_return(!(events & ~(EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET)), -EINVAL);
1482 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1483 assert_return(!event_pid_changed(s->event), -ECHILD);
1485 /* edge-triggered updates are never skipped, so we can reset edges */
1486 if (s->io.events == events && !(events & EPOLLET))
1489 if (s->enabled != SD_EVENT_OFF) {
1490 r = source_io_register(s, s->enabled, events);
1495 s->io.events = events;
1496 source_set_pending(s, false);
1501 /// UNNEEDED by elogind
1503 _public_ int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents) {
1504 assert_return(s, -EINVAL);
1505 assert_return(revents, -EINVAL);
1506 assert_return(s->type == SOURCE_IO, -EDOM);
1507 assert_return(s->pending, -ENODATA);
1508 assert_return(!event_pid_changed(s->event), -ECHILD);
1510 *revents = s->io.revents;
1514 _public_ int sd_event_source_get_signal(sd_event_source *s) {
1515 assert_return(s, -EINVAL);
1516 assert_return(s->type == SOURCE_SIGNAL, -EDOM);
1517 assert_return(!event_pid_changed(s->event), -ECHILD);
1519 return s->signal.sig;
1522 _public_ int sd_event_source_get_priority(sd_event_source *s, int64_t *priority) {
1523 assert_return(s, -EINVAL);
1524 assert_return(!event_pid_changed(s->event), -ECHILD);
1530 _public_ int sd_event_source_set_priority(sd_event_source *s, int64_t priority) {
1533 assert_return(s, -EINVAL);
1534 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1535 assert_return(!event_pid_changed(s->event), -ECHILD);
1537 if (s->priority == priority)
1540 if (s->type == SOURCE_SIGNAL && s->enabled != SD_EVENT_OFF) {
1541 struct signal_data *old, *d;
1543 /* Move us from the signalfd belonging to the old
1544 * priority to the signalfd of the new priority */
1546 assert_se(old = hashmap_get(s->event->signal_data, &s->priority));
1548 s->priority = priority;
1550 r = event_make_signal_data(s->event, s->signal.sig, &d);
1552 s->priority = old->priority;
1556 event_unmask_signal_data(s->event, old, s->signal.sig);
1558 s->priority = priority;
1561 prioq_reshuffle(s->event->pending, s, &s->pending_index);
1564 prioq_reshuffle(s->event->prepare, s, &s->prepare_index);
1566 if (s->type == SOURCE_EXIT)
1567 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1572 /// UNNEEDED by elogind
1574 _public_ int sd_event_source_get_enabled(sd_event_source *s, int *m) {
1575 assert_return(s, -EINVAL);
1576 assert_return(m, -EINVAL);
1577 assert_return(!event_pid_changed(s->event), -ECHILD);
1584 _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) {
1587 assert_return(s, -EINVAL);
1588 assert_return(m == SD_EVENT_OFF || m == SD_EVENT_ON || m == SD_EVENT_ONESHOT, -EINVAL);
1589 assert_return(!event_pid_changed(s->event), -ECHILD);
1591 /* If we are dead anyway, we are fine with turning off
1592 * sources, but everything else needs to fail. */
1593 if (s->event->state == SD_EVENT_FINISHED)
1594 return m == SD_EVENT_OFF ? 0 : -ESTALE;
1596 if (s->enabled == m)
1599 if (m == SD_EVENT_OFF) {
1604 source_io_unregister(s);
1608 case SOURCE_TIME_REALTIME:
1609 case SOURCE_TIME_BOOTTIME:
1610 case SOURCE_TIME_MONOTONIC:
1611 case SOURCE_TIME_REALTIME_ALARM:
1612 case SOURCE_TIME_BOOTTIME_ALARM: {
1613 struct clock_data *d;
1616 d = event_get_clock_data(s->event, s->type);
1619 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1620 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1621 d->needs_rearm = true;
1628 event_gc_signal_data(s->event, &s->priority, s->signal.sig);
1634 assert(s->event->n_enabled_child_sources > 0);
1635 s->event->n_enabled_child_sources--;
1637 event_gc_signal_data(s->event, &s->priority, SIGCHLD);
1642 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1651 assert_not_reached("Wut? I shouldn't exist.");
1658 r = source_io_register(s, m, s->io.events);
1665 case SOURCE_TIME_REALTIME:
1666 case SOURCE_TIME_BOOTTIME:
1667 case SOURCE_TIME_MONOTONIC:
1668 case SOURCE_TIME_REALTIME_ALARM:
1669 case SOURCE_TIME_BOOTTIME_ALARM: {
1670 struct clock_data *d;
1673 d = event_get_clock_data(s->event, s->type);
1676 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1677 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1678 d->needs_rearm = true;
1686 r = event_make_signal_data(s->event, s->signal.sig, NULL);
1688 s->enabled = SD_EVENT_OFF;
1689 event_gc_signal_data(s->event, &s->priority, s->signal.sig);
1697 if (s->enabled == SD_EVENT_OFF)
1698 s->event->n_enabled_child_sources++;
1702 r = event_make_signal_data(s->event, SIGCHLD, NULL);
1704 s->enabled = SD_EVENT_OFF;
1705 s->event->n_enabled_child_sources--;
1706 event_gc_signal_data(s->event, &s->priority, SIGCHLD);
1714 prioq_reshuffle(s->event->exit, s, &s->exit.prioq_index);
1723 assert_not_reached("Wut? I shouldn't exist.");
1728 prioq_reshuffle(s->event->pending, s, &s->pending_index);
1731 prioq_reshuffle(s->event->prepare, s, &s->prepare_index);
1736 _public_ int sd_event_source_get_time(sd_event_source *s, uint64_t *usec) {
1737 assert_return(s, -EINVAL);
1738 assert_return(usec, -EINVAL);
1739 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1740 assert_return(!event_pid_changed(s->event), -ECHILD);
1742 *usec = s->time.next;
1746 _public_ int sd_event_source_set_time(sd_event_source *s, uint64_t usec) {
1747 struct clock_data *d;
1749 assert_return(s, -EINVAL);
1750 assert_return(usec != (uint64_t) -1, -EINVAL);
1751 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1752 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1753 assert_return(!event_pid_changed(s->event), -ECHILD);
1755 s->time.next = usec;
1757 source_set_pending(s, false);
1759 d = event_get_clock_data(s->event, s->type);
1762 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
1763 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1764 d->needs_rearm = true;
1769 /// UNNEEDED by elogind
1771 _public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
1772 assert_return(s, -EINVAL);
1773 assert_return(usec, -EINVAL);
1774 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1775 assert_return(!event_pid_changed(s->event), -ECHILD);
1777 *usec = s->time.accuracy;
1781 _public_ int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec) {
1782 struct clock_data *d;
1784 assert_return(s, -EINVAL);
1785 assert_return(usec != (uint64_t) -1, -EINVAL);
1786 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1787 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1788 assert_return(!event_pid_changed(s->event), -ECHILD);
1791 usec = DEFAULT_ACCURACY_USEC;
1793 s->time.accuracy = usec;
1795 source_set_pending(s, false);
1797 d = event_get_clock_data(s->event, s->type);
1800 prioq_reshuffle(d->latest, s, &s->time.latest_index);
1801 d->needs_rearm = true;
1806 _public_ int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock) {
1807 assert_return(s, -EINVAL);
1808 assert_return(clock, -EINVAL);
1809 assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
1810 assert_return(!event_pid_changed(s->event), -ECHILD);
1812 *clock = event_source_type_to_clock(s->type);
1816 _public_ int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid) {
1817 assert_return(s, -EINVAL);
1818 assert_return(pid, -EINVAL);
1819 assert_return(s->type == SOURCE_CHILD, -EDOM);
1820 assert_return(!event_pid_changed(s->event), -ECHILD);
1822 *pid = s->child.pid;
1827 _public_ int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback) {
1830 assert_return(s, -EINVAL);
1831 assert_return(s->type != SOURCE_EXIT, -EDOM);
1832 assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
1833 assert_return(!event_pid_changed(s->event), -ECHILD);
1835 if (s->prepare == callback)
1838 if (callback && s->prepare) {
1839 s->prepare = callback;
1843 r = prioq_ensure_allocated(&s->event->prepare, prepare_prioq_compare);
1847 s->prepare = callback;
1850 r = prioq_put(s->event->prepare, s, &s->prepare_index);
1854 prioq_remove(s->event->prepare, s, &s->prepare_index);
1859 /// UNNEEDED by elogind
1861 _public_ void* sd_event_source_get_userdata(sd_event_source *s) {
1862 assert_return(s, NULL);
1867 _public_ void *sd_event_source_set_userdata(sd_event_source *s, void *userdata) {
1870 assert_return(s, NULL);
1873 s->userdata = userdata;
1879 static usec_t sleep_between(sd_event *e, usec_t a, usec_t b) {
1890 initialize_perturb(e);
1893 Find a good time to wake up again between times a and b. We
1894 have two goals here:
1896 a) We want to wake up as seldom as possible, hence prefer
1897 later times over earlier times.
1899 b) But if we have to wake up, then let's make sure to
1900 dispatch as much as possible on the entire system.
1902 We implement this by waking up everywhere at the same time
1903 within any given minute if we can, synchronised via the
1904 perturbation value determined from the boot ID. If we can't,
1905 then we try to find the same spot in every 10s, then 1s and
1906 then 250ms step. Otherwise, we pick the last possible time
1910 c = (b / USEC_PER_MINUTE) * USEC_PER_MINUTE + e->perturb;
1912 if (_unlikely_(c < USEC_PER_MINUTE))
1915 c -= USEC_PER_MINUTE;
1921 c = (b / (USEC_PER_SEC*10)) * (USEC_PER_SEC*10) + (e->perturb % (USEC_PER_SEC*10));
1923 if (_unlikely_(c < USEC_PER_SEC*10))
1926 c -= USEC_PER_SEC*10;
1932 c = (b / USEC_PER_SEC) * USEC_PER_SEC + (e->perturb % USEC_PER_SEC);
1934 if (_unlikely_(c < USEC_PER_SEC))
1943 c = (b / (USEC_PER_MSEC*250)) * (USEC_PER_MSEC*250) + (e->perturb % (USEC_PER_MSEC*250));
1945 if (_unlikely_(c < USEC_PER_MSEC*250))
1948 c -= USEC_PER_MSEC*250;
1957 static int event_arm_timer(
1959 struct clock_data *d) {
1961 struct itimerspec its = {};
1962 sd_event_source *a, *b;
1969 if (!d->needs_rearm)
1972 d->needs_rearm = false;
1974 a = prioq_peek(d->earliest);
1975 if (!a || a->enabled == SD_EVENT_OFF) {
1980 if (d->next == USEC_INFINITY)
1984 r = timerfd_settime(d->fd, TFD_TIMER_ABSTIME, &its, NULL);
1988 d->next = USEC_INFINITY;
1992 b = prioq_peek(d->latest);
1993 assert_se(b && b->enabled != SD_EVENT_OFF);
1995 t = sleep_between(e, a->time.next, b->time.next + b->time.accuracy);
1999 assert_se(d->fd >= 0);
2002 /* We don' want to disarm here, just mean some time looooong ago. */
2003 its.it_value.tv_sec = 0;
2004 its.it_value.tv_nsec = 1;
2006 timespec_store(&its.it_value, t);
2008 r = timerfd_settime(d->fd, TFD_TIMER_ABSTIME, &its, NULL);
2016 static int process_io(sd_event *e, sd_event_source *s, uint32_t revents) {
2019 assert(s->type == SOURCE_IO);
2021 /* If the event source was already pending, we just OR in the
2022 * new revents, otherwise we reset the value. The ORing is
2023 * necessary to handle EPOLLONESHOT events properly where
2024 * readability might happen independently of writability, and
2025 * we need to keep track of both */
2028 s->io.revents |= revents;
2030 s->io.revents = revents;
2032 return source_set_pending(s, true);
2035 static int flush_timer(sd_event *e, int fd, uint32_t events, usec_t *next) {
2042 assert_return(events == EPOLLIN, -EIO);
2044 ss = read(fd, &x, sizeof(x));
2046 if (errno == EAGAIN || errno == EINTR)
2052 if (_unlikely_(ss != sizeof(x)))
2056 *next = USEC_INFINITY;
2061 static int process_timer(
2064 struct clock_data *d) {
2073 s = prioq_peek(d->earliest);
2076 s->enabled == SD_EVENT_OFF ||
2080 r = source_set_pending(s, true);
2084 prioq_reshuffle(d->earliest, s, &s->time.earliest_index);
2085 prioq_reshuffle(d->latest, s, &s->time.latest_index);
2086 d->needs_rearm = true;
2092 static int process_child(sd_event *e) {
2099 e->need_process_child = false;
2102 So, this is ugly. We iteratively invoke waitid() with P_PID
2103 + WNOHANG for each PID we wait for, instead of using
2104 P_ALL. This is because we only want to get child
2105 information of very specific child processes, and not all
2106 of them. We might not have processed the SIGCHLD even of a
2107 previous invocation and we don't want to maintain a
2108 unbounded *per-child* event queue, hence we really don't
2109 want anything flushed out of the kernel's queue that we
2110 don't care about. Since this is O(n) this means that if you
2111 have a lot of processes you probably want to handle SIGCHLD
2114 We do not reap the children here (by using WNOWAIT), this
2115 is only done after the event source is dispatched so that
2116 the callback still sees the process as a zombie.
2119 HASHMAP_FOREACH(s, e->child_sources, i) {
2120 assert(s->type == SOURCE_CHILD);
2125 if (s->enabled == SD_EVENT_OFF)
2128 zero(s->child.siginfo);
2129 r = waitid(P_PID, s->child.pid, &s->child.siginfo,
2130 WNOHANG | (s->child.options & WEXITED ? WNOWAIT : 0) | s->child.options);
2134 if (s->child.siginfo.si_pid != 0) {
2136 s->child.siginfo.si_code == CLD_EXITED ||
2137 s->child.siginfo.si_code == CLD_KILLED ||
2138 s->child.siginfo.si_code == CLD_DUMPED;
2140 if (!zombie && (s->child.options & WEXITED)) {
2141 /* If the child isn't dead then let's
2142 * immediately remove the state change
2143 * from the queue, since there's no
2144 * benefit in leaving it queued */
2146 assert(s->child.options & (WSTOPPED|WCONTINUED));
2147 waitid(P_PID, s->child.pid, &s->child.siginfo, WNOHANG|(s->child.options & (WSTOPPED|WCONTINUED)));
2150 r = source_set_pending(s, true);
2159 static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
2160 bool read_one = false;
2164 assert_return(events == EPOLLIN, -EIO);
2166 /* If there's a signal queued on this priority and SIGCHLD is
2167 on this priority too, then make sure to recheck the
2168 children we watch. This is because we only ever dequeue
2169 the first signal per priority, and if we dequeue one, and
2170 SIGCHLD might be enqueued later we wouldn't know, but we
2171 might have higher priority children we care about hence we
2172 need to check that explicitly. */
2174 if (sigismember(&d->sigset, SIGCHLD))
2175 e->need_process_child = true;
2177 /* If there's already an event source pending for this
2178 * priority we don't read another */
2183 struct signalfd_siginfo si;
2185 sd_event_source *s = NULL;
2187 n = read(d->fd, &si, sizeof(si));
2189 if (errno == EAGAIN || errno == EINTR)
2195 if (_unlikely_(n != sizeof(si)))
2198 assert(si.ssi_signo < _NSIG);
2202 if (e->signal_sources)
2203 s = e->signal_sources[si.ssi_signo];
2209 s->signal.siginfo = si;
2212 r = source_set_pending(s, true);
2220 static int source_dispatch(sd_event_source *s) {
2224 assert(s->pending || s->type == SOURCE_EXIT);
2226 if (s->type != SOURCE_DEFER && s->type != SOURCE_EXIT) {
2227 r = source_set_pending(s, false);
2232 if (s->type != SOURCE_POST) {
2236 /* If we execute a non-post source, let's mark all
2237 * post sources as pending */
2239 SET_FOREACH(z, s->event->post_sources, i) {
2240 if (z->enabled == SD_EVENT_OFF)
2243 r = source_set_pending(z, true);
2249 if (s->enabled == SD_EVENT_ONESHOT) {
2250 r = sd_event_source_set_enabled(s, SD_EVENT_OFF);
2255 s->dispatching = true;
2260 r = s->io.callback(s, s->io.fd, s->io.revents, s->userdata);
2263 case SOURCE_TIME_REALTIME:
2264 case SOURCE_TIME_BOOTTIME:
2265 case SOURCE_TIME_MONOTONIC:
2266 case SOURCE_TIME_REALTIME_ALARM:
2267 case SOURCE_TIME_BOOTTIME_ALARM:
2268 r = s->time.callback(s, s->time.next, s->userdata);
2272 r = s->signal.callback(s, &s->signal.siginfo, s->userdata);
2275 case SOURCE_CHILD: {
2278 zombie = s->child.siginfo.si_code == CLD_EXITED ||
2279 s->child.siginfo.si_code == CLD_KILLED ||
2280 s->child.siginfo.si_code == CLD_DUMPED;
2282 r = s->child.callback(s, &s->child.siginfo, s->userdata);
2284 /* Now, reap the PID for good. */
2286 waitid(P_PID, s->child.pid, &s->child.siginfo, WNOHANG|WEXITED);
2292 r = s->defer.callback(s, s->userdata);
2296 r = s->post.callback(s, s->userdata);
2300 r = s->exit.callback(s, s->userdata);
2303 case SOURCE_WATCHDOG:
2304 case _SOURCE_EVENT_SOURCE_TYPE_MAX:
2305 case _SOURCE_EVENT_SOURCE_TYPE_INVALID:
2306 assert_not_reached("Wut? I shouldn't exist.");
2309 s->dispatching = false;
2313 log_debug_errno(r, "Event source '%s' returned error, disabling: %m", s->description);
2315 log_debug_errno(r, "Event source %p returned error, disabling: %m", s);
2321 sd_event_source_set_enabled(s, SD_EVENT_OFF);
2326 static int event_prepare(sd_event *e) {
2334 s = prioq_peek(e->prepare);
2335 if (!s || s->prepare_iteration == e->iteration || s->enabled == SD_EVENT_OFF)
2338 s->prepare_iteration = e->iteration;
2339 r = prioq_reshuffle(e->prepare, s, &s->prepare_index);
2345 s->dispatching = true;
2346 r = s->prepare(s, s->userdata);
2347 s->dispatching = false;
2351 log_debug_errno(r, "Prepare callback of event source '%s' returned error, disabling: %m", s->description);
2353 log_debug_errno(r, "Prepare callback of event source %p returned error, disabling: %m", s);
2359 sd_event_source_set_enabled(s, SD_EVENT_OFF);
2365 static int dispatch_exit(sd_event *e) {
2371 p = prioq_peek(e->exit);
2372 if (!p || p->enabled == SD_EVENT_OFF) {
2373 e->state = SD_EVENT_FINISHED;
2379 e->state = SD_EVENT_EXITING;
2381 r = source_dispatch(p);
2383 e->state = SD_EVENT_INITIAL;
2389 static sd_event_source* event_next_pending(sd_event *e) {
2394 p = prioq_peek(e->pending);
2398 if (p->enabled == SD_EVENT_OFF)
2404 static int arm_watchdog(sd_event *e) {
2405 struct itimerspec its = {};
2410 assert(e->watchdog_fd >= 0);
2412 t = sleep_between(e,
2413 e->watchdog_last + (e->watchdog_period / 2),
2414 e->watchdog_last + (e->watchdog_period * 3 / 4));
2416 timespec_store(&its.it_value, t);
2418 /* Make sure we never set the watchdog to 0, which tells the
2419 * kernel to disable it. */
2420 if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0)
2421 its.it_value.tv_nsec = 1;
2423 r = timerfd_settime(e->watchdog_fd, TFD_TIMER_ABSTIME, &its, NULL);
2430 static int process_watchdog(sd_event *e) {
2436 /* Don't notify watchdog too often */
2437 if (e->watchdog_last + e->watchdog_period / 4 > e->timestamp.monotonic)
2440 sd_notify(false, "WATCHDOG=1");
2441 e->watchdog_last = e->timestamp.monotonic;
2443 return arm_watchdog(e);
2446 _public_ int sd_event_prepare(sd_event *e) {
2449 assert_return(e, -EINVAL);
2450 assert_return(!event_pid_changed(e), -ECHILD);
2451 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2452 assert_return(e->state == SD_EVENT_INITIAL, -EBUSY);
2454 if (e->exit_requested)
2459 r = event_prepare(e);
2463 r = event_arm_timer(e, &e->realtime);
2467 r = event_arm_timer(e, &e->boottime);
2471 r = event_arm_timer(e, &e->monotonic);
2475 r = event_arm_timer(e, &e->realtime_alarm);
2479 r = event_arm_timer(e, &e->boottime_alarm);
2483 if (event_next_pending(e) || e->need_process_child)
2486 e->state = SD_EVENT_ARMED;
2491 e->state = SD_EVENT_ARMED;
2492 r = sd_event_wait(e, 0);
2494 e->state = SD_EVENT_ARMED;
2499 _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
2500 struct epoll_event *ev_queue;
2501 unsigned ev_queue_max;
2504 assert_return(e, -EINVAL);
2505 assert_return(!event_pid_changed(e), -ECHILD);
2506 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2507 assert_return(e->state == SD_EVENT_ARMED, -EBUSY);
2509 if (e->exit_requested) {
2510 e->state = SD_EVENT_PENDING;
2514 ev_queue_max = MAX(e->n_sources, 1u);
2515 ev_queue = newa(struct epoll_event, ev_queue_max);
2517 m = epoll_wait(e->epoll_fd, ev_queue, ev_queue_max,
2518 timeout == (uint64_t) -1 ? -1 : (int) ((timeout + USEC_PER_MSEC - 1) / USEC_PER_MSEC));
2520 if (errno == EINTR) {
2521 e->state = SD_EVENT_PENDING;
2529 dual_timestamp_get(&e->timestamp);
2530 e->timestamp_boottime = now(CLOCK_BOOTTIME);
2532 for (i = 0; i < m; i++) {
2534 if (ev_queue[i].data.ptr == INT_TO_PTR(SOURCE_WATCHDOG))
2535 r = flush_timer(e, e->watchdog_fd, ev_queue[i].events, NULL);
2537 WakeupType *t = ev_queue[i].data.ptr;
2541 case WAKEUP_EVENT_SOURCE:
2542 r = process_io(e, ev_queue[i].data.ptr, ev_queue[i].events);
2545 case WAKEUP_CLOCK_DATA: {
2546 struct clock_data *d = ev_queue[i].data.ptr;
2547 r = flush_timer(e, d->fd, ev_queue[i].events, &d->next);
2551 case WAKEUP_SIGNAL_DATA:
2552 r = process_signal(e, ev_queue[i].data.ptr, ev_queue[i].events);
2556 assert_not_reached("Invalid wake-up pointer");
2563 r = process_watchdog(e);
2567 r = process_timer(e, e->timestamp.realtime, &e->realtime);
2571 r = process_timer(e, e->timestamp_boottime, &e->boottime);
2575 r = process_timer(e, e->timestamp.monotonic, &e->monotonic);
2579 r = process_timer(e, e->timestamp.realtime, &e->realtime_alarm);
2583 r = process_timer(e, e->timestamp_boottime, &e->boottime_alarm);
2587 if (e->need_process_child) {
2588 r = process_child(e);
2593 if (event_next_pending(e)) {
2594 e->state = SD_EVENT_PENDING;
2602 e->state = SD_EVENT_INITIAL;
2607 _public_ int sd_event_dispatch(sd_event *e) {
2611 assert_return(e, -EINVAL);
2612 assert_return(!event_pid_changed(e), -ECHILD);
2613 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2614 assert_return(e->state == SD_EVENT_PENDING, -EBUSY);
2616 if (e->exit_requested)
2617 return dispatch_exit(e);
2619 p = event_next_pending(e);
2623 e->state = SD_EVENT_RUNNING;
2624 r = source_dispatch(p);
2625 e->state = SD_EVENT_INITIAL;
2632 e->state = SD_EVENT_INITIAL;
2637 _public_ int sd_event_run(sd_event *e, uint64_t timeout) {
2640 assert_return(e, -EINVAL);
2641 assert_return(!event_pid_changed(e), -ECHILD);
2642 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2643 assert_return(e->state == SD_EVENT_INITIAL, -EBUSY);
2645 r = sd_event_prepare(e);
2647 /* There was nothing? Then wait... */
2648 r = sd_event_wait(e, timeout);
2651 /* There's something now, then let's dispatch it */
2652 r = sd_event_dispatch(e);
2662 /// UNNEEDED by elogind
2664 _public_ int sd_event_loop(sd_event *e) {
2667 assert_return(e, -EINVAL);
2668 assert_return(!event_pid_changed(e), -ECHILD);
2669 assert_return(e->state == SD_EVENT_INITIAL, -EBUSY);
2673 while (e->state != SD_EVENT_FINISHED) {
2674 r = sd_event_run(e, (uint64_t) -1);
2686 _public_ int sd_event_get_fd(sd_event *e) {
2688 assert_return(e, -EINVAL);
2689 assert_return(!event_pid_changed(e), -ECHILD);
2695 _public_ int sd_event_get_state(sd_event *e) {
2696 assert_return(e, -EINVAL);
2697 assert_return(!event_pid_changed(e), -ECHILD);
2702 _public_ int sd_event_get_exit_code(sd_event *e, int *code) {
2703 assert_return(e, -EINVAL);
2704 assert_return(code, -EINVAL);
2705 assert_return(!event_pid_changed(e), -ECHILD);
2707 if (!e->exit_requested)
2710 *code = e->exit_code;
2714 _public_ int sd_event_exit(sd_event *e, int code) {
2715 assert_return(e, -EINVAL);
2716 assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
2717 assert_return(!event_pid_changed(e), -ECHILD);
2719 e->exit_requested = true;
2720 e->exit_code = code;
2725 /// UNNEEDED by elogind
2727 _public_ int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec) {
2728 assert_return(e, -EINVAL);
2729 assert_return(usec, -EINVAL);
2730 assert_return(!event_pid_changed(e), -ECHILD);
2732 if (!dual_timestamp_is_set(&e->timestamp)) {
2733 /* Implicitly fall back to now() if we never ran
2734 * before and thus have no cached time. */
2741 case CLOCK_REALTIME:
2742 case CLOCK_REALTIME_ALARM:
2743 *usec = e->timestamp.realtime;
2746 case CLOCK_MONOTONIC:
2747 *usec = e->timestamp.monotonic;
2750 case CLOCK_BOOTTIME:
2751 case CLOCK_BOOTTIME_ALARM:
2752 *usec = e->timestamp_boottime;
2760 _public_ int sd_event_default(sd_event **ret) {
2762 static thread_local sd_event *default_event = NULL;
2767 return !!default_event;
2769 if (default_event) {
2770 *ret = sd_event_ref(default_event);
2774 r = sd_event_new(&e);
2778 e->default_event_ptr = &default_event;
2786 _public_ int sd_event_get_tid(sd_event *e, pid_t *tid) {
2787 assert_return(e, -EINVAL);
2788 assert_return(tid, -EINVAL);
2789 assert_return(!event_pid_changed(e), -ECHILD);
2799 _public_ int sd_event_set_watchdog(sd_event *e, int b) {
2802 assert_return(e, -EINVAL);
2803 assert_return(!event_pid_changed(e), -ECHILD);
2805 if (e->watchdog == !!b)
2809 struct epoll_event ev = {};
2811 r = sd_watchdog_enabled(false, &e->watchdog_period);
2815 /* Issue first ping immediately */
2816 sd_notify(false, "WATCHDOG=1");
2817 e->watchdog_last = now(CLOCK_MONOTONIC);
2819 e->watchdog_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
2820 if (e->watchdog_fd < 0)
2823 r = arm_watchdog(e);
2827 ev.events = EPOLLIN;
2828 ev.data.ptr = INT_TO_PTR(SOURCE_WATCHDOG);
2830 r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->watchdog_fd, &ev);
2837 if (e->watchdog_fd >= 0) {
2838 epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, e->watchdog_fd, NULL);
2839 e->watchdog_fd = safe_close(e->watchdog_fd);
2847 e->watchdog_fd = safe_close(e->watchdog_fd);
2851 /// UNNEEDED by elogind
2853 _public_ int sd_event_get_watchdog(sd_event *e) {
2854 assert_return(e, -EINVAL);
2855 assert_return(!event_pid_changed(e), -ECHILD);