1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include <sys/timerfd.h>
11 #include "alloc-util.h"
12 #include "event-source.h"
20 #include "process-util.h"
22 #include "signal-util.h"
23 #include "string-table.h"
24 #include "string-util.h"
25 #include "time-util.h"
28 #define DEFAULT_ACCURACY_USEC (250 * USEC_PER_MSEC)
30 static const char* const event_source_type_table
[_SOURCE_EVENT_SOURCE_TYPE_MAX
] = {
32 [SOURCE_TIME_REALTIME
] = "realtime",
33 [SOURCE_TIME_BOOTTIME
] = "bootime",
34 [SOURCE_TIME_MONOTONIC
] = "monotonic",
35 [SOURCE_TIME_REALTIME_ALARM
] = "realtime-alarm",
36 [SOURCE_TIME_BOOTTIME_ALARM
] = "boottime-alarm",
37 [SOURCE_SIGNAL
] = "signal",
38 [SOURCE_CHILD
] = "child",
39 [SOURCE_DEFER
] = "defer",
40 [SOURCE_POST
] = "post",
41 [SOURCE_EXIT
] = "exit",
42 [SOURCE_WATCHDOG
] = "watchdog",
43 [SOURCE_INOTIFY
] = "inotify",
46 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(event_source_type
, int);
48 #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)
59 /* timerfd_create() only supports these five clocks so far. We
60 * can add support for more clocks when the kernel learns to
61 * deal with them, too. */
62 struct clock_data realtime
;
63 struct clock_data boottime
;
64 struct clock_data monotonic
;
65 struct clock_data realtime_alarm
;
66 struct clock_data boottime_alarm
;
70 sd_event_source
**signal_sources
; /* indexed by signal number */
71 Hashmap
*signal_data
; /* indexed by priority */
73 Hashmap
*child_sources
;
74 unsigned n_enabled_child_sources
;
80 Hashmap
*inotify_data
; /* indexed by priority */
82 /* A list of inode structures that still have an fd open, that we need to close before the next loop iteration */
83 LIST_HEAD(struct inode_data
, inode_data_to_close
);
85 /* A list of inotify objects that already have events buffered which aren't processed yet */
86 LIST_HEAD(struct inotify_data
, inotify_data_buffered
);
91 triple_timestamp timestamp
;
94 bool exit_requested
:1;
95 bool need_process_child
:1;
97 bool profile_delays
:1;
102 sd_event
**default_event_ptr
;
104 usec_t watchdog_last
, watchdog_period
;
108 LIST_HEAD(sd_event_source
, sources
);
110 usec_t last_run
, last_log
;
111 unsigned delays
[sizeof(usec_t
) * 8];
114 static thread_local sd_event
*default_event
= NULL
;
116 static void source_disconnect(sd_event_source
*s
);
117 static void event_gc_inode_data(sd_event
*e
, struct inode_data
*d
);
119 static sd_event
*event_resolve(sd_event
*e
) {
120 return e
== SD_EVENT_DEFAULT
? default_event
: e
;
123 static int pending_prioq_compare(const void *a
, const void *b
) {
124 const sd_event_source
*x
= a
, *y
= b
;
130 /* Enabled ones first */
131 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
133 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
136 /* Lower priority values first */
137 r
= CMP(x
->priority
, y
->priority
);
141 /* Older entries first */
142 return CMP(x
->pending_iteration
, y
->pending_iteration
);
145 static int prepare_prioq_compare(const void *a
, const void *b
) {
146 const sd_event_source
*x
= a
, *y
= b
;
152 /* Enabled ones first */
153 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
155 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
158 /* Move most recently prepared ones last, so that we can stop
159 * preparing as soon as we hit one that has already been
160 * prepared in the current iteration */
161 r
= CMP(x
->prepare_iteration
, y
->prepare_iteration
);
165 /* Lower priority values first */
166 return CMP(x
->priority
, y
->priority
);
169 static int earliest_time_prioq_compare(const void *a
, const void *b
) {
170 const sd_event_source
*x
= a
, *y
= b
;
172 assert(EVENT_SOURCE_IS_TIME(x
->type
));
173 assert(x
->type
== y
->type
);
175 /* Enabled ones first */
176 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
178 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
181 /* Move the pending ones to the end */
182 if (!x
->pending
&& y
->pending
)
184 if (x
->pending
&& !y
->pending
)
188 return CMP(x
->time
.next
, y
->time
.next
);
191 static usec_t
time_event_source_latest(const sd_event_source
*s
) {
192 return usec_add(s
->time
.next
, s
->time
.accuracy
);
195 static int latest_time_prioq_compare(const void *a
, const void *b
) {
196 const sd_event_source
*x
= a
, *y
= b
;
198 assert(EVENT_SOURCE_IS_TIME(x
->type
));
199 assert(x
->type
== y
->type
);
201 /* Enabled ones first */
202 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
204 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
207 /* Move the pending ones to the end */
208 if (!x
->pending
&& y
->pending
)
210 if (x
->pending
&& !y
->pending
)
214 return CMP(time_event_source_latest(x
), time_event_source_latest(y
));
217 static int exit_prioq_compare(const void *a
, const void *b
) {
218 const sd_event_source
*x
= a
, *y
= b
;
220 assert(x
->type
== SOURCE_EXIT
);
221 assert(y
->type
== SOURCE_EXIT
);
223 /* Enabled ones first */
224 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
226 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
229 /* Lower priority values first */
230 return CMP(x
->priority
, y
->priority
);
233 static void free_clock_data(struct clock_data
*d
) {
235 assert(d
->wakeup
== WAKEUP_CLOCK_DATA
);
238 prioq_free(d
->earliest
);
239 prioq_free(d
->latest
);
242 static sd_event
*event_free(sd_event
*e
) {
247 while ((s
= e
->sources
)) {
249 source_disconnect(s
);
250 sd_event_source_unref(s
);
253 assert(e
->n_sources
== 0);
255 if (e
->default_event_ptr
)
256 *(e
->default_event_ptr
) = NULL
;
258 safe_close(e
->epoll_fd
);
259 safe_close(e
->watchdog_fd
);
261 free_clock_data(&e
->realtime
);
262 free_clock_data(&e
->boottime
);
263 free_clock_data(&e
->monotonic
);
264 free_clock_data(&e
->realtime_alarm
);
265 free_clock_data(&e
->boottime_alarm
);
267 prioq_free(e
->pending
);
268 prioq_free(e
->prepare
);
271 free(e
->signal_sources
);
272 hashmap_free(e
->signal_data
);
274 hashmap_free(e
->inotify_data
);
276 hashmap_free(e
->child_sources
);
277 set_free(e
->post_sources
);
282 _public_
int sd_event_new(sd_event
** ret
) {
286 assert_return(ret
, -EINVAL
);
288 e
= new(sd_event
, 1);
296 .realtime
.wakeup
= WAKEUP_CLOCK_DATA
,
298 .realtime
.next
= USEC_INFINITY
,
299 .boottime
.wakeup
= WAKEUP_CLOCK_DATA
,
301 .boottime
.next
= USEC_INFINITY
,
302 .monotonic
.wakeup
= WAKEUP_CLOCK_DATA
,
304 .monotonic
.next
= USEC_INFINITY
,
305 .realtime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
306 .realtime_alarm
.fd
= -1,
307 .realtime_alarm
.next
= USEC_INFINITY
,
308 .boottime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
309 .boottime_alarm
.fd
= -1,
310 .boottime_alarm
.next
= USEC_INFINITY
,
311 .perturb
= USEC_INFINITY
,
312 .original_pid
= getpid_cached(),
315 r
= prioq_ensure_allocated(&e
->pending
, pending_prioq_compare
);
319 e
->epoll_fd
= epoll_create1(EPOLL_CLOEXEC
);
320 if (e
->epoll_fd
< 0) {
325 e
->epoll_fd
= fd_move_above_stdio(e
->epoll_fd
);
327 if (secure_getenv("SD_EVENT_PROFILE_DELAYS")) {
328 log_debug("Event loop profiling enabled. Logarithmic histogram of event loop iterations in the range 2^0 ... 2^63 us will be logged every 5s.");
329 e
->profile_delays
= true;
340 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event
, sd_event
, event_free
);
342 static bool event_pid_changed(sd_event
*e
) {
345 /* We don't support people creating an event loop and keeping
346 * it around over a fork(). Let's complain. */
348 return e
->original_pid
!= getpid_cached();
351 static void source_io_unregister(sd_event_source
*s
) {
355 assert(s
->type
== SOURCE_IO
);
357 if (event_pid_changed(s
->event
))
360 if (!s
->io
.registered
)
363 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, s
->io
.fd
, NULL
);
365 log_debug_errno(errno
, "Failed to remove source %s (type %s) from epoll: %m",
366 strna(s
->description
), event_source_type_to_string(s
->type
));
368 s
->io
.registered
= false;
371 static int source_io_register(
376 struct epoll_event ev
;
380 assert(s
->type
== SOURCE_IO
);
381 assert(enabled
!= SD_EVENT_OFF
);
383 ev
= (struct epoll_event
) {
384 .events
= events
| (enabled
== SD_EVENT_ONESHOT
? EPOLLONESHOT
: 0),
388 if (s
->io
.registered
)
389 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_MOD
, s
->io
.fd
, &ev
);
391 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_ADD
, s
->io
.fd
, &ev
);
395 s
->io
.registered
= true;
400 static clockid_t
event_source_type_to_clock(EventSourceType t
) {
404 case SOURCE_TIME_REALTIME
:
405 return CLOCK_REALTIME
;
407 case SOURCE_TIME_BOOTTIME
:
408 return CLOCK_BOOTTIME
;
410 case SOURCE_TIME_MONOTONIC
:
411 return CLOCK_MONOTONIC
;
413 case SOURCE_TIME_REALTIME_ALARM
:
414 return CLOCK_REALTIME_ALARM
;
416 case SOURCE_TIME_BOOTTIME_ALARM
:
417 return CLOCK_BOOTTIME_ALARM
;
420 return (clockid_t
) -1;
424 static EventSourceType
clock_to_event_source_type(clockid_t clock
) {
429 return SOURCE_TIME_REALTIME
;
432 return SOURCE_TIME_BOOTTIME
;
434 case CLOCK_MONOTONIC
:
435 return SOURCE_TIME_MONOTONIC
;
437 case CLOCK_REALTIME_ALARM
:
438 return SOURCE_TIME_REALTIME_ALARM
;
440 case CLOCK_BOOTTIME_ALARM
:
441 return SOURCE_TIME_BOOTTIME_ALARM
;
444 return _SOURCE_EVENT_SOURCE_TYPE_INVALID
;
448 static struct clock_data
* event_get_clock_data(sd_event
*e
, EventSourceType t
) {
453 case SOURCE_TIME_REALTIME
:
456 case SOURCE_TIME_BOOTTIME
:
459 case SOURCE_TIME_MONOTONIC
:
460 return &e
->monotonic
;
462 case SOURCE_TIME_REALTIME_ALARM
:
463 return &e
->realtime_alarm
;
465 case SOURCE_TIME_BOOTTIME_ALARM
:
466 return &e
->boottime_alarm
;
473 static int event_make_signal_data(
476 struct signal_data
**ret
) {
478 struct epoll_event ev
;
479 struct signal_data
*d
;
487 if (event_pid_changed(e
))
490 if (e
->signal_sources
&& e
->signal_sources
[sig
])
491 priority
= e
->signal_sources
[sig
]->priority
;
493 priority
= SD_EVENT_PRIORITY_NORMAL
;
495 d
= hashmap_get(e
->signal_data
, &priority
);
497 if (sigismember(&d
->sigset
, sig
) > 0) {
503 r
= hashmap_ensure_allocated(&e
->signal_data
, &uint64_hash_ops
);
507 d
= new(struct signal_data
, 1);
511 *d
= (struct signal_data
) {
512 .wakeup
= WAKEUP_SIGNAL_DATA
,
514 .priority
= priority
,
517 r
= hashmap_put(e
->signal_data
, &d
->priority
, d
);
527 assert_se(sigaddset(&ss_copy
, sig
) >= 0);
529 r
= signalfd(d
->fd
, &ss_copy
, SFD_NONBLOCK
|SFD_CLOEXEC
);
543 d
->fd
= fd_move_above_stdio(r
);
545 ev
= (struct epoll_event
) {
550 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
);
563 d
->fd
= safe_close(d
->fd
);
564 hashmap_remove(e
->signal_data
, &d
->priority
);
571 static void event_unmask_signal_data(sd_event
*e
, struct signal_data
*d
, int sig
) {
575 /* Turns off the specified signal in the signal data
576 * object. If the signal mask of the object becomes empty that
579 if (sigismember(&d
->sigset
, sig
) == 0)
582 assert_se(sigdelset(&d
->sigset
, sig
) >= 0);
584 if (sigisemptyset(&d
->sigset
)) {
586 /* If all the mask is all-zero we can get rid of the structure */
587 hashmap_remove(e
->signal_data
, &d
->priority
);
595 if (signalfd(d
->fd
, &d
->sigset
, SFD_NONBLOCK
|SFD_CLOEXEC
) < 0)
596 log_debug_errno(errno
, "Failed to unset signal bit, ignoring: %m");
599 static void event_gc_signal_data(sd_event
*e
, const int64_t *priority
, int sig
) {
600 struct signal_data
*d
;
601 static const int64_t zero_priority
= 0;
605 /* Rechecks if the specified signal is still something we are
606 * interested in. If not, we'll unmask it, and possibly drop
607 * the signalfd for it. */
609 if (sig
== SIGCHLD
&&
610 e
->n_enabled_child_sources
> 0)
613 if (e
->signal_sources
&&
614 e
->signal_sources
[sig
] &&
615 e
->signal_sources
[sig
]->enabled
!= SD_EVENT_OFF
)
619 * The specified signal might be enabled in three different queues:
621 * 1) the one that belongs to the priority passed (if it is non-NULL)
622 * 2) the one that belongs to the priority of the event source of the signal (if there is one)
623 * 3) the 0 priority (to cover the SIGCHLD case)
625 * Hence, let's remove it from all three here.
629 d
= hashmap_get(e
->signal_data
, priority
);
631 event_unmask_signal_data(e
, d
, sig
);
634 if (e
->signal_sources
&& e
->signal_sources
[sig
]) {
635 d
= hashmap_get(e
->signal_data
, &e
->signal_sources
[sig
]->priority
);
637 event_unmask_signal_data(e
, d
, sig
);
640 d
= hashmap_get(e
->signal_data
, &zero_priority
);
642 event_unmask_signal_data(e
, d
, sig
);
645 static void source_disconnect(sd_event_source
*s
) {
653 assert(s
->event
->n_sources
> 0);
659 source_io_unregister(s
);
663 case SOURCE_TIME_REALTIME
:
664 case SOURCE_TIME_BOOTTIME
:
665 case SOURCE_TIME_MONOTONIC
:
666 case SOURCE_TIME_REALTIME_ALARM
:
667 case SOURCE_TIME_BOOTTIME_ALARM
: {
668 struct clock_data
*d
;
670 d
= event_get_clock_data(s
->event
, s
->type
);
673 prioq_remove(d
->earliest
, s
, &s
->time
.earliest_index
);
674 prioq_remove(d
->latest
, s
, &s
->time
.latest_index
);
675 d
->needs_rearm
= true;
680 if (s
->signal
.sig
> 0) {
682 if (s
->event
->signal_sources
)
683 s
->event
->signal_sources
[s
->signal
.sig
] = NULL
;
685 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
691 if (s
->child
.pid
> 0) {
692 if (s
->enabled
!= SD_EVENT_OFF
) {
693 assert(s
->event
->n_enabled_child_sources
> 0);
694 s
->event
->n_enabled_child_sources
--;
697 (void) hashmap_remove(s
->event
->child_sources
, PID_TO_PTR(s
->child
.pid
));
698 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
708 set_remove(s
->event
->post_sources
, s
);
712 prioq_remove(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
715 case SOURCE_INOTIFY
: {
716 struct inode_data
*inode_data
;
718 inode_data
= s
->inotify
.inode_data
;
720 struct inotify_data
*inotify_data
;
721 assert_se(inotify_data
= inode_data
->inotify_data
);
723 /* Detach this event source from the inode object */
724 LIST_REMOVE(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
725 s
->inotify
.inode_data
= NULL
;
728 assert(inotify_data
->n_pending
> 0);
729 inotify_data
->n_pending
--;
732 /* Note that we don't reduce the inotify mask for the watch descriptor here if the inode is
733 * continued to being watched. That's because inotify doesn't really have an API for that: we
734 * can only change watch masks with access to the original inode either by fd or by path. But
735 * paths aren't stable, and keeping an O_PATH fd open all the time would mean wasting an fd
736 * continuously and keeping the mount busy which we can't really do. We could reconstruct the
737 * original inode from /proc/self/fdinfo/$INOTIFY_FD (as all watch descriptors are listed
738 * there), but given the need for open_by_handle_at() which is privileged and not universally
739 * available this would be quite an incomplete solution. Hence we go the other way, leave the
740 * mask set, even if it is not minimized now, and ignore all events we aren't interested in
741 * anymore after reception. Yes, this sucks, but … Linux … */
743 /* Maybe release the inode data (and its inotify) */
744 event_gc_inode_data(s
->event
, inode_data
);
751 assert_not_reached("Wut? I shouldn't exist.");
755 prioq_remove(s
->event
->pending
, s
, &s
->pending_index
);
758 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
762 s
->type
= _SOURCE_EVENT_SOURCE_TYPE_INVALID
;
764 LIST_REMOVE(sources
, event
->sources
, s
);
768 sd_event_unref(event
);
771 static void source_free(sd_event_source
*s
) {
774 source_disconnect(s
);
776 if (s
->type
== SOURCE_IO
&& s
->io
.owned
)
777 s
->io
.fd
= safe_close(s
->io
.fd
);
779 if (s
->destroy_callback
)
780 s
->destroy_callback(s
->userdata
);
782 free(s
->description
);
785 DEFINE_TRIVIAL_CLEANUP_FUNC(sd_event_source
*, source_free
);
787 static int source_set_pending(sd_event_source
*s
, bool b
) {
791 assert(s
->type
!= SOURCE_EXIT
);
799 s
->pending_iteration
= s
->event
->iteration
;
801 r
= prioq_put(s
->event
->pending
, s
, &s
->pending_index
);
807 assert_se(prioq_remove(s
->event
->pending
, s
, &s
->pending_index
));
809 if (EVENT_SOURCE_IS_TIME(s
->type
)) {
810 struct clock_data
*d
;
812 d
= event_get_clock_data(s
->event
, s
->type
);
815 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
816 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
817 d
->needs_rearm
= true;
820 if (s
->type
== SOURCE_SIGNAL
&& !b
) {
821 struct signal_data
*d
;
823 d
= hashmap_get(s
->event
->signal_data
, &s
->priority
);
824 if (d
&& d
->current
== s
)
828 if (s
->type
== SOURCE_INOTIFY
) {
830 assert(s
->inotify
.inode_data
);
831 assert(s
->inotify
.inode_data
->inotify_data
);
834 s
->inotify
.inode_data
->inotify_data
->n_pending
++;
836 assert(s
->inotify
.inode_data
->inotify_data
->n_pending
> 0);
837 s
->inotify
.inode_data
->inotify_data
->n_pending
--;
844 static sd_event_source
*source_new(sd_event
*e
, bool floating
, EventSourceType type
) {
849 s
= new(sd_event_source
, 1);
853 *s
= (struct sd_event_source
) {
856 .floating
= floating
,
858 .pending_index
= PRIOQ_IDX_NULL
,
859 .prepare_index
= PRIOQ_IDX_NULL
,
865 LIST_PREPEND(sources
, e
->sources
, s
);
871 _public_
int sd_event_add_io(
873 sd_event_source
**ret
,
876 sd_event_io_handler_t callback
,
879 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
882 assert_return(e
, -EINVAL
);
883 assert_return(e
= event_resolve(e
), -ENOPKG
);
884 assert_return(fd
>= 0, -EBADF
);
885 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
886 assert_return(callback
, -EINVAL
);
887 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
888 assert_return(!event_pid_changed(e
), -ECHILD
);
890 s
= source_new(e
, !ret
, SOURCE_IO
);
894 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
896 s
->io
.events
= events
;
897 s
->io
.callback
= callback
;
898 s
->userdata
= userdata
;
899 s
->enabled
= SD_EVENT_ON
;
901 r
= source_io_register(s
, s
->enabled
, events
);
912 static void initialize_perturb(sd_event
*e
) {
913 sd_id128_t bootid
= {};
915 /* When we sleep for longer, we try to realign the wakeup to
916 the same time within each minute/second/250ms, so that
917 events all across the system can be coalesced into a single
918 CPU wakeup. However, let's take some system-specific
919 randomness for this value, so that in a network of systems
920 with synced clocks timer events are distributed a
921 bit. Here, we calculate a perturbation usec offset from the
924 if (_likely_(e
->perturb
!= USEC_INFINITY
))
927 if (sd_id128_get_boot(&bootid
) >= 0)
928 e
->perturb
= (bootid
.qwords
[0] ^ bootid
.qwords
[1]) % USEC_PER_MINUTE
;
931 static int event_setup_timer_fd(
933 struct clock_data
*d
,
936 struct epoll_event ev
;
942 if (_likely_(d
->fd
>= 0))
945 fd
= timerfd_create(clock
, TFD_NONBLOCK
|TFD_CLOEXEC
);
949 fd
= fd_move_above_stdio(fd
);
951 ev
= (struct epoll_event
) {
956 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, fd
, &ev
);
966 static int time_exit_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
969 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
972 _public_
int sd_event_add_time(
974 sd_event_source
**ret
,
978 sd_event_time_handler_t callback
,
981 EventSourceType type
;
982 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
983 struct clock_data
*d
;
986 assert_return(e
, -EINVAL
);
987 assert_return(e
= event_resolve(e
), -ENOPKG
);
988 assert_return(accuracy
!= (uint64_t) -1, -EINVAL
);
989 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
990 assert_return(!event_pid_changed(e
), -ECHILD
);
992 if (!clock_supported(clock
)) /* Checks whether the kernel supports the clock */
995 type
= clock_to_event_source_type(clock
); /* checks whether sd-event supports this clock */
1000 callback
= time_exit_callback
;
1002 d
= event_get_clock_data(e
, type
);
1005 r
= prioq_ensure_allocated(&d
->earliest
, earliest_time_prioq_compare
);
1009 r
= prioq_ensure_allocated(&d
->latest
, latest_time_prioq_compare
);
1014 r
= event_setup_timer_fd(e
, d
, clock
);
1019 s
= source_new(e
, !ret
, type
);
1023 s
->time
.next
= usec
;
1024 s
->time
.accuracy
= accuracy
== 0 ? DEFAULT_ACCURACY_USEC
: accuracy
;
1025 s
->time
.callback
= callback
;
1026 s
->time
.earliest_index
= s
->time
.latest_index
= PRIOQ_IDX_NULL
;
1027 s
->userdata
= userdata
;
1028 s
->enabled
= SD_EVENT_ONESHOT
;
1030 d
->needs_rearm
= true;
1032 r
= prioq_put(d
->earliest
, s
, &s
->time
.earliest_index
);
1036 r
= prioq_put(d
->latest
, s
, &s
->time
.latest_index
);
1047 static int signal_exit_callback(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1050 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
1053 _public_
int sd_event_add_signal(
1055 sd_event_source
**ret
,
1057 sd_event_signal_handler_t callback
,
1060 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1061 struct signal_data
*d
;
1065 assert_return(e
, -EINVAL
);
1066 assert_return(e
= event_resolve(e
), -ENOPKG
);
1067 assert_return(SIGNAL_VALID(sig
), -EINVAL
);
1068 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1069 assert_return(!event_pid_changed(e
), -ECHILD
);
1072 callback
= signal_exit_callback
;
1074 r
= pthread_sigmask(SIG_SETMASK
, NULL
, &ss
);
1078 if (!sigismember(&ss
, sig
))
1081 if (!e
->signal_sources
) {
1082 e
->signal_sources
= new0(sd_event_source
*, _NSIG
);
1083 if (!e
->signal_sources
)
1085 } else if (e
->signal_sources
[sig
])
1088 s
= source_new(e
, !ret
, SOURCE_SIGNAL
);
1092 s
->signal
.sig
= sig
;
1093 s
->signal
.callback
= callback
;
1094 s
->userdata
= userdata
;
1095 s
->enabled
= SD_EVENT_ON
;
1097 e
->signal_sources
[sig
] = s
;
1099 r
= event_make_signal_data(e
, sig
, &d
);
1103 /* Use the signal name as description for the event source by default */
1104 (void) sd_event_source_set_description(s
, signal_to_string(sig
));
1113 _public_
int sd_event_add_child(
1115 sd_event_source
**ret
,
1118 sd_event_child_handler_t callback
,
1121 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1124 assert_return(e
, -EINVAL
);
1125 assert_return(e
= event_resolve(e
), -ENOPKG
);
1126 assert_return(pid
> 1, -EINVAL
);
1127 assert_return(!(options
& ~(WEXITED
|WSTOPPED
|WCONTINUED
)), -EINVAL
);
1128 assert_return(options
!= 0, -EINVAL
);
1129 assert_return(callback
, -EINVAL
);
1130 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1131 assert_return(!event_pid_changed(e
), -ECHILD
);
1133 r
= hashmap_ensure_allocated(&e
->child_sources
, NULL
);
1137 if (hashmap_contains(e
->child_sources
, PID_TO_PTR(pid
)))
1140 s
= source_new(e
, !ret
, SOURCE_CHILD
);
1145 s
->child
.options
= options
;
1146 s
->child
.callback
= callback
;
1147 s
->userdata
= userdata
;
1148 s
->enabled
= SD_EVENT_ONESHOT
;
1150 r
= hashmap_put(e
->child_sources
, PID_TO_PTR(pid
), s
);
1154 e
->n_enabled_child_sources
++;
1156 r
= event_make_signal_data(e
, SIGCHLD
, NULL
);
1158 e
->n_enabled_child_sources
--;
1162 e
->need_process_child
= true;
1171 _public_
int sd_event_add_defer(
1173 sd_event_source
**ret
,
1174 sd_event_handler_t callback
,
1177 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1180 assert_return(e
, -EINVAL
);
1181 assert_return(e
= event_resolve(e
), -ENOPKG
);
1182 assert_return(callback
, -EINVAL
);
1183 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1184 assert_return(!event_pid_changed(e
), -ECHILD
);
1186 s
= source_new(e
, !ret
, SOURCE_DEFER
);
1190 s
->defer
.callback
= callback
;
1191 s
->userdata
= userdata
;
1192 s
->enabled
= SD_EVENT_ONESHOT
;
1194 r
= source_set_pending(s
, true);
1205 _public_
int sd_event_add_post(
1207 sd_event_source
**ret
,
1208 sd_event_handler_t callback
,
1211 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1214 assert_return(e
, -EINVAL
);
1215 assert_return(e
= event_resolve(e
), -ENOPKG
);
1216 assert_return(callback
, -EINVAL
);
1217 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1218 assert_return(!event_pid_changed(e
), -ECHILD
);
1220 r
= set_ensure_allocated(&e
->post_sources
, NULL
);
1224 s
= source_new(e
, !ret
, SOURCE_POST
);
1228 s
->post
.callback
= callback
;
1229 s
->userdata
= userdata
;
1230 s
->enabled
= SD_EVENT_ON
;
1232 r
= set_put(e
->post_sources
, s
);
1243 _public_
int sd_event_add_exit(
1245 sd_event_source
**ret
,
1246 sd_event_handler_t callback
,
1249 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1252 assert_return(e
, -EINVAL
);
1253 assert_return(e
= event_resolve(e
), -ENOPKG
);
1254 assert_return(callback
, -EINVAL
);
1255 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1256 assert_return(!event_pid_changed(e
), -ECHILD
);
1258 r
= prioq_ensure_allocated(&e
->exit
, exit_prioq_compare
);
1262 s
= source_new(e
, !ret
, SOURCE_EXIT
);
1266 s
->exit
.callback
= callback
;
1267 s
->userdata
= userdata
;
1268 s
->exit
.prioq_index
= PRIOQ_IDX_NULL
;
1269 s
->enabled
= SD_EVENT_ONESHOT
;
1271 r
= prioq_put(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
1282 static void event_free_inotify_data(sd_event
*e
, struct inotify_data
*d
) {
1288 assert(hashmap_isempty(d
->inodes
));
1289 assert(hashmap_isempty(d
->wd
));
1291 if (d
->buffer_filled
> 0)
1292 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
1294 hashmap_free(d
->inodes
);
1295 hashmap_free(d
->wd
);
1297 assert_se(hashmap_remove(e
->inotify_data
, &d
->priority
) == d
);
1300 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, d
->fd
, NULL
) < 0)
1301 log_debug_errno(errno
, "Failed to remove inotify fd from epoll, ignoring: %m");
1308 static int event_make_inotify_data(
1311 struct inotify_data
**ret
) {
1313 _cleanup_close_
int fd
= -1;
1314 struct inotify_data
*d
;
1315 struct epoll_event ev
;
1320 d
= hashmap_get(e
->inotify_data
, &priority
);
1327 fd
= inotify_init1(IN_NONBLOCK
|O_CLOEXEC
);
1331 fd
= fd_move_above_stdio(fd
);
1333 r
= hashmap_ensure_allocated(&e
->inotify_data
, &uint64_hash_ops
);
1337 d
= new(struct inotify_data
, 1);
1341 *d
= (struct inotify_data
) {
1342 .wakeup
= WAKEUP_INOTIFY_DATA
,
1344 .priority
= priority
,
1347 r
= hashmap_put(e
->inotify_data
, &d
->priority
, d
);
1349 d
->fd
= safe_close(d
->fd
);
1354 ev
= (struct epoll_event
) {
1359 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
) < 0) {
1361 d
->fd
= safe_close(d
->fd
); /* let's close this ourselves, as event_free_inotify_data() would otherwise
1362 * remove the fd from the epoll first, which we don't want as we couldn't
1363 * add it in the first place. */
1364 event_free_inotify_data(e
, d
);
1374 static int inode_data_compare(const void *a
, const void *b
) {
1375 const struct inode_data
*x
= a
, *y
= b
;
1381 r
= CMP(x
->dev
, y
->dev
);
1385 return CMP(x
->ino
, y
->ino
);
1388 static void inode_data_hash_func(const void *p
, struct siphash
*state
) {
1389 const struct inode_data
*d
= p
;
1393 siphash24_compress(&d
->dev
, sizeof(d
->dev
), state
);
1394 siphash24_compress(&d
->ino
, sizeof(d
->ino
), state
);
1397 const struct hash_ops inode_data_hash_ops
= {
1398 .hash
= inode_data_hash_func
,
1399 .compare
= inode_data_compare
1402 static void event_free_inode_data(
1404 struct inode_data
*d
) {
1411 assert(!d
->event_sources
);
1414 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
1418 if (d
->inotify_data
) {
1421 if (d
->inotify_data
->fd
>= 0) {
1422 /* So here's a problem. At the time this runs the watch descriptor might already be
1423 * invalidated, because an IN_IGNORED event might be queued right the moment we enter
1424 * the syscall. Hence, whenever we get EINVAL, ignore it entirely, since it's a very
1425 * likely case to happen. */
1427 if (inotify_rm_watch(d
->inotify_data
->fd
, d
->wd
) < 0 && errno
!= EINVAL
)
1428 log_debug_errno(errno
, "Failed to remove watch descriptor %i from inotify, ignoring: %m", d
->wd
);
1431 assert_se(hashmap_remove(d
->inotify_data
->wd
, INT_TO_PTR(d
->wd
)) == d
);
1434 assert_se(hashmap_remove(d
->inotify_data
->inodes
, d
) == d
);
1440 static void event_gc_inode_data(
1442 struct inode_data
*d
) {
1444 struct inotify_data
*inotify_data
;
1451 if (d
->event_sources
)
1454 inotify_data
= d
->inotify_data
;
1455 event_free_inode_data(e
, d
);
1457 if (inotify_data
&& hashmap_isempty(inotify_data
->inodes
))
1458 event_free_inotify_data(e
, inotify_data
);
1461 static int event_make_inode_data(
1463 struct inotify_data
*inotify_data
,
1466 struct inode_data
**ret
) {
1468 struct inode_data
*d
, key
;
1472 assert(inotify_data
);
1474 key
= (struct inode_data
) {
1479 d
= hashmap_get(inotify_data
->inodes
, &key
);
1487 r
= hashmap_ensure_allocated(&inotify_data
->inodes
, &inode_data_hash_ops
);
1491 d
= new(struct inode_data
, 1);
1495 *d
= (struct inode_data
) {
1500 .inotify_data
= inotify_data
,
1503 r
= hashmap_put(inotify_data
->inodes
, d
, d
);
1515 static uint32_t inode_data_determine_mask(struct inode_data
*d
) {
1516 bool excl_unlink
= true;
1517 uint32_t combined
= 0;
1522 /* Combines the watch masks of all event sources watching this inode. We generally just OR them together, but
1523 * the IN_EXCL_UNLINK flag is ANDed instead.
1525 * Note that we add all sources to the mask here, regardless whether enabled, disabled or oneshot. That's
1526 * because we cannot change the mask anymore after the event source was created once, since the kernel has no
1527 * API for that. Hence we need to subscribe to the maximum mask we ever might be interested in, and suppress
1528 * events we don't care for client-side. */
1530 LIST_FOREACH(inotify
.by_inode_data
, s
, d
->event_sources
) {
1532 if ((s
->inotify
.mask
& IN_EXCL_UNLINK
) == 0)
1533 excl_unlink
= false;
1535 combined
|= s
->inotify
.mask
;
1538 return (combined
& ~(IN_ONESHOT
|IN_DONT_FOLLOW
|IN_ONLYDIR
|IN_EXCL_UNLINK
)) | (excl_unlink
? IN_EXCL_UNLINK
: 0);
1541 static int inode_data_realize_watch(sd_event
*e
, struct inode_data
*d
) {
1542 uint32_t combined_mask
;
1548 combined_mask
= inode_data_determine_mask(d
);
1550 if (d
->wd
>= 0 && combined_mask
== d
->combined_mask
)
1553 r
= hashmap_ensure_allocated(&d
->inotify_data
->wd
, NULL
);
1557 wd
= inotify_add_watch_fd(d
->inotify_data
->fd
, d
->fd
, combined_mask
);
1562 r
= hashmap_put(d
->inotify_data
->wd
, INT_TO_PTR(wd
), d
);
1564 (void) inotify_rm_watch(d
->inotify_data
->fd
, wd
);
1570 } else if (d
->wd
!= wd
) {
1572 log_debug("Weird, the watch descriptor we already knew for this inode changed?");
1573 (void) inotify_rm_watch(d
->fd
, wd
);
1577 d
->combined_mask
= combined_mask
;
1581 _public_
int sd_event_add_inotify(
1583 sd_event_source
**ret
,
1586 sd_event_inotify_handler_t callback
,
1589 struct inotify_data
*inotify_data
= NULL
;
1590 struct inode_data
*inode_data
= NULL
;
1591 _cleanup_close_
int fd
= -1;
1592 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1596 assert_return(e
, -EINVAL
);
1597 assert_return(e
= event_resolve(e
), -ENOPKG
);
1598 assert_return(path
, -EINVAL
);
1599 assert_return(callback
, -EINVAL
);
1600 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1601 assert_return(!event_pid_changed(e
), -ECHILD
);
1603 /* Refuse IN_MASK_ADD since we coalesce watches on the same inode, and hence really don't want to merge
1604 * masks. Or in other words, this whole code exists only to manage IN_MASK_ADD type operations for you, hence
1605 * the user can't use them for us. */
1606 if (mask
& IN_MASK_ADD
)
1609 fd
= open(path
, O_PATH
|O_CLOEXEC
|
1610 (mask
& IN_ONLYDIR
? O_DIRECTORY
: 0)|
1611 (mask
& IN_DONT_FOLLOW
? O_NOFOLLOW
: 0));
1615 if (fstat(fd
, &st
) < 0)
1618 s
= source_new(e
, !ret
, SOURCE_INOTIFY
);
1622 s
->enabled
= mask
& IN_ONESHOT
? SD_EVENT_ONESHOT
: SD_EVENT_ON
;
1623 s
->inotify
.mask
= mask
;
1624 s
->inotify
.callback
= callback
;
1625 s
->userdata
= userdata
;
1627 /* Allocate an inotify object for this priority, and an inode object within it */
1628 r
= event_make_inotify_data(e
, SD_EVENT_PRIORITY_NORMAL
, &inotify_data
);
1632 r
= event_make_inode_data(e
, inotify_data
, st
.st_dev
, st
.st_ino
, &inode_data
);
1634 event_free_inotify_data(e
, inotify_data
);
1638 /* Keep the O_PATH fd around until the first iteration of the loop, so that we can still change the priority of
1639 * the event source, until then, for which we need the original inode. */
1640 if (inode_data
->fd
< 0) {
1641 inode_data
->fd
= TAKE_FD(fd
);
1642 LIST_PREPEND(to_close
, e
->inode_data_to_close
, inode_data
);
1645 /* Link our event source to the inode data object */
1646 LIST_PREPEND(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
1647 s
->inotify
.inode_data
= inode_data
;
1649 /* Actually realize the watch now */
1650 r
= inode_data_realize_watch(e
, inode_data
);
1654 (void) sd_event_source_set_description(s
, path
);
1663 static sd_event_source
* event_source_free(sd_event_source
*s
) {
1667 /* Here's a special hack: when we are called from a
1668 * dispatch handler we won't free the event source
1669 * immediately, but we will detach the fd from the
1670 * epoll. This way it is safe for the caller to unref
1671 * the event source and immediately close the fd, but
1672 * we still retain a valid event source object after
1675 if (s
->dispatching
) {
1676 if (s
->type
== SOURCE_IO
)
1677 source_io_unregister(s
);
1679 source_disconnect(s
);
1686 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event_source
, sd_event_source
, event_source_free
);
1688 _public_
int sd_event_source_set_description(sd_event_source
*s
, const char *description
) {
1689 assert_return(s
, -EINVAL
);
1690 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1692 return free_and_strdup(&s
->description
, description
);
1695 _public_
int sd_event_source_get_description(sd_event_source
*s
, const char **description
) {
1696 assert_return(s
, -EINVAL
);
1697 assert_return(description
, -EINVAL
);
1698 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1700 if (!s
->description
)
1703 *description
= s
->description
;
1707 _public_ sd_event
*sd_event_source_get_event(sd_event_source
*s
) {
1708 assert_return(s
, NULL
);
1713 _public_
int sd_event_source_get_pending(sd_event_source
*s
) {
1714 assert_return(s
, -EINVAL
);
1715 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
1716 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1717 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1722 _public_
int sd_event_source_get_io_fd(sd_event_source
*s
) {
1723 assert_return(s
, -EINVAL
);
1724 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1725 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1730 _public_
int sd_event_source_set_io_fd(sd_event_source
*s
, int fd
) {
1733 assert_return(s
, -EINVAL
);
1734 assert_return(fd
>= 0, -EBADF
);
1735 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1736 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1741 if (s
->enabled
== SD_EVENT_OFF
) {
1743 s
->io
.registered
= false;
1747 saved_fd
= s
->io
.fd
;
1748 assert(s
->io
.registered
);
1751 s
->io
.registered
= false;
1753 r
= source_io_register(s
, s
->enabled
, s
->io
.events
);
1755 s
->io
.fd
= saved_fd
;
1756 s
->io
.registered
= true;
1760 epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, saved_fd
, NULL
);
1766 _public_
int sd_event_source_get_io_fd_own(sd_event_source
*s
) {
1767 assert_return(s
, -EINVAL
);
1768 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1773 _public_
int sd_event_source_set_io_fd_own(sd_event_source
*s
, int own
) {
1774 assert_return(s
, -EINVAL
);
1775 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1781 _public_
int sd_event_source_get_io_events(sd_event_source
*s
, uint32_t* events
) {
1782 assert_return(s
, -EINVAL
);
1783 assert_return(events
, -EINVAL
);
1784 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1785 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1787 *events
= s
->io
.events
;
1791 _public_
int sd_event_source_set_io_events(sd_event_source
*s
, uint32_t events
) {
1794 assert_return(s
, -EINVAL
);
1795 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1796 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
1797 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1798 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1800 /* edge-triggered updates are never skipped, so we can reset edges */
1801 if (s
->io
.events
== events
&& !(events
& EPOLLET
))
1804 r
= source_set_pending(s
, false);
1808 if (s
->enabled
!= SD_EVENT_OFF
) {
1809 r
= source_io_register(s
, s
->enabled
, events
);
1814 s
->io
.events
= events
;
1819 _public_
int sd_event_source_get_io_revents(sd_event_source
*s
, uint32_t* revents
) {
1820 assert_return(s
, -EINVAL
);
1821 assert_return(revents
, -EINVAL
);
1822 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1823 assert_return(s
->pending
, -ENODATA
);
1824 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1826 *revents
= s
->io
.revents
;
1830 _public_
int sd_event_source_get_signal(sd_event_source
*s
) {
1831 assert_return(s
, -EINVAL
);
1832 assert_return(s
->type
== SOURCE_SIGNAL
, -EDOM
);
1833 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1835 return s
->signal
.sig
;
1838 _public_
int sd_event_source_get_priority(sd_event_source
*s
, int64_t *priority
) {
1839 assert_return(s
, -EINVAL
);
1840 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1842 *priority
= s
->priority
;
1846 _public_
int sd_event_source_set_priority(sd_event_source
*s
, int64_t priority
) {
1847 bool rm_inotify
= false, rm_inode
= false;
1848 struct inotify_data
*new_inotify_data
= NULL
;
1849 struct inode_data
*new_inode_data
= NULL
;
1852 assert_return(s
, -EINVAL
);
1853 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1854 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1856 if (s
->priority
== priority
)
1859 if (s
->type
== SOURCE_INOTIFY
) {
1860 struct inode_data
*old_inode_data
;
1862 assert(s
->inotify
.inode_data
);
1863 old_inode_data
= s
->inotify
.inode_data
;
1865 /* We need the original fd to change the priority. If we don't have it we can't change the priority,
1866 * anymore. Note that we close any fds when entering the next event loop iteration, i.e. for inotify
1867 * events we allow priority changes only until the first following iteration. */
1868 if (old_inode_data
->fd
< 0)
1871 r
= event_make_inotify_data(s
->event
, priority
, &new_inotify_data
);
1876 r
= event_make_inode_data(s
->event
, new_inotify_data
, old_inode_data
->dev
, old_inode_data
->ino
, &new_inode_data
);
1881 if (new_inode_data
->fd
< 0) {
1882 /* Duplicate the fd for the new inode object if we don't have any yet */
1883 new_inode_data
->fd
= fcntl(old_inode_data
->fd
, F_DUPFD_CLOEXEC
, 3);
1884 if (new_inode_data
->fd
< 0) {
1889 LIST_PREPEND(to_close
, s
->event
->inode_data_to_close
, new_inode_data
);
1892 /* Move the event source to the new inode data structure */
1893 LIST_REMOVE(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
1894 LIST_PREPEND(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
1895 s
->inotify
.inode_data
= new_inode_data
;
1897 /* Now create the new watch */
1898 r
= inode_data_realize_watch(s
->event
, new_inode_data
);
1901 LIST_REMOVE(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
1902 LIST_PREPEND(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
1903 s
->inotify
.inode_data
= old_inode_data
;
1907 s
->priority
= priority
;
1909 event_gc_inode_data(s
->event
, old_inode_data
);
1911 } else if (s
->type
== SOURCE_SIGNAL
&& s
->enabled
!= SD_EVENT_OFF
) {
1912 struct signal_data
*old
, *d
;
1914 /* Move us from the signalfd belonging to the old
1915 * priority to the signalfd of the new priority */
1917 assert_se(old
= hashmap_get(s
->event
->signal_data
, &s
->priority
));
1919 s
->priority
= priority
;
1921 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, &d
);
1923 s
->priority
= old
->priority
;
1927 event_unmask_signal_data(s
->event
, old
, s
->signal
.sig
);
1929 s
->priority
= priority
;
1932 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
1935 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
1937 if (s
->type
== SOURCE_EXIT
)
1938 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
1944 event_free_inode_data(s
->event
, new_inode_data
);
1947 event_free_inotify_data(s
->event
, new_inotify_data
);
1952 _public_
int sd_event_source_get_enabled(sd_event_source
*s
, int *m
) {
1953 assert_return(s
, -EINVAL
);
1954 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1958 return s
->enabled
!= SD_EVENT_OFF
;
1961 _public_
int sd_event_source_set_enabled(sd_event_source
*s
, int m
) {
1964 assert_return(s
, -EINVAL
);
1965 assert_return(IN_SET(m
, SD_EVENT_OFF
, SD_EVENT_ON
, SD_EVENT_ONESHOT
), -EINVAL
);
1966 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1968 /* If we are dead anyway, we are fine with turning off
1969 * sources, but everything else needs to fail. */
1970 if (s
->event
->state
== SD_EVENT_FINISHED
)
1971 return m
== SD_EVENT_OFF
? 0 : -ESTALE
;
1973 if (s
->enabled
== m
)
1976 if (m
== SD_EVENT_OFF
) {
1978 /* Unset the pending flag when this event source is disabled */
1979 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
1980 r
= source_set_pending(s
, false);
1988 source_io_unregister(s
);
1992 case SOURCE_TIME_REALTIME
:
1993 case SOURCE_TIME_BOOTTIME
:
1994 case SOURCE_TIME_MONOTONIC
:
1995 case SOURCE_TIME_REALTIME_ALARM
:
1996 case SOURCE_TIME_BOOTTIME_ALARM
: {
1997 struct clock_data
*d
;
2000 d
= event_get_clock_data(s
->event
, s
->type
);
2003 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2004 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2005 d
->needs_rearm
= true;
2012 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2018 assert(s
->event
->n_enabled_child_sources
> 0);
2019 s
->event
->n_enabled_child_sources
--;
2021 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2026 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2031 case SOURCE_INOTIFY
:
2036 assert_not_reached("Wut? I shouldn't exist.");
2041 /* Unset the pending flag when this event source is enabled */
2042 if (s
->enabled
== SD_EVENT_OFF
&& !IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2043 r
= source_set_pending(s
, false);
2051 r
= source_io_register(s
, m
, s
->io
.events
);
2058 case SOURCE_TIME_REALTIME
:
2059 case SOURCE_TIME_BOOTTIME
:
2060 case SOURCE_TIME_MONOTONIC
:
2061 case SOURCE_TIME_REALTIME_ALARM
:
2062 case SOURCE_TIME_BOOTTIME_ALARM
: {
2063 struct clock_data
*d
;
2066 d
= event_get_clock_data(s
->event
, s
->type
);
2069 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2070 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2071 d
->needs_rearm
= true;
2079 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, NULL
);
2081 s
->enabled
= SD_EVENT_OFF
;
2082 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2090 if (s
->enabled
== SD_EVENT_OFF
)
2091 s
->event
->n_enabled_child_sources
++;
2095 r
= event_make_signal_data(s
->event
, SIGCHLD
, NULL
);
2097 s
->enabled
= SD_EVENT_OFF
;
2098 s
->event
->n_enabled_child_sources
--;
2099 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2107 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2112 case SOURCE_INOTIFY
:
2117 assert_not_reached("Wut? I shouldn't exist.");
2122 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
2125 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
2130 _public_
int sd_event_source_get_time(sd_event_source
*s
, uint64_t *usec
) {
2131 assert_return(s
, -EINVAL
);
2132 assert_return(usec
, -EINVAL
);
2133 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2134 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2136 *usec
= s
->time
.next
;
2140 _public_
int sd_event_source_set_time(sd_event_source
*s
, uint64_t usec
) {
2141 struct clock_data
*d
;
2144 assert_return(s
, -EINVAL
);
2145 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2146 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2147 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2149 r
= source_set_pending(s
, false);
2153 s
->time
.next
= usec
;
2155 d
= event_get_clock_data(s
->event
, s
->type
);
2158 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2159 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2160 d
->needs_rearm
= true;
2165 _public_
int sd_event_source_get_time_accuracy(sd_event_source
*s
, uint64_t *usec
) {
2166 assert_return(s
, -EINVAL
);
2167 assert_return(usec
, -EINVAL
);
2168 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2169 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2171 *usec
= s
->time
.accuracy
;
2175 _public_
int sd_event_source_set_time_accuracy(sd_event_source
*s
, uint64_t usec
) {
2176 struct clock_data
*d
;
2179 assert_return(s
, -EINVAL
);
2180 assert_return(usec
!= (uint64_t) -1, -EINVAL
);
2181 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2182 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2183 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2185 r
= source_set_pending(s
, false);
2190 usec
= DEFAULT_ACCURACY_USEC
;
2192 s
->time
.accuracy
= usec
;
2194 d
= event_get_clock_data(s
->event
, s
->type
);
2197 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2198 d
->needs_rearm
= true;
2203 _public_
int sd_event_source_get_time_clock(sd_event_source
*s
, clockid_t
*clock
) {
2204 assert_return(s
, -EINVAL
);
2205 assert_return(clock
, -EINVAL
);
2206 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2207 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2209 *clock
= event_source_type_to_clock(s
->type
);
2213 _public_
int sd_event_source_get_child_pid(sd_event_source
*s
, pid_t
*pid
) {
2214 assert_return(s
, -EINVAL
);
2215 assert_return(pid
, -EINVAL
);
2216 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2217 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2219 *pid
= s
->child
.pid
;
2223 _public_
int sd_event_source_get_inotify_mask(sd_event_source
*s
, uint32_t *mask
) {
2224 assert_return(s
, -EINVAL
);
2225 assert_return(mask
, -EINVAL
);
2226 assert_return(s
->type
== SOURCE_INOTIFY
, -EDOM
);
2227 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2229 *mask
= s
->inotify
.mask
;
2233 _public_
int sd_event_source_set_prepare(sd_event_source
*s
, sd_event_handler_t callback
) {
2236 assert_return(s
, -EINVAL
);
2237 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
2238 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2239 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2241 if (s
->prepare
== callback
)
2244 if (callback
&& s
->prepare
) {
2245 s
->prepare
= callback
;
2249 r
= prioq_ensure_allocated(&s
->event
->prepare
, prepare_prioq_compare
);
2253 s
->prepare
= callback
;
2256 r
= prioq_put(s
->event
->prepare
, s
, &s
->prepare_index
);
2260 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
2265 _public_
void* sd_event_source_get_userdata(sd_event_source
*s
) {
2266 assert_return(s
, NULL
);
2271 _public_
void *sd_event_source_set_userdata(sd_event_source
*s
, void *userdata
) {
2274 assert_return(s
, NULL
);
2277 s
->userdata
= userdata
;
2282 static usec_t
sleep_between(sd_event
*e
, usec_t a
, usec_t b
) {
2289 if (a
>= USEC_INFINITY
)
2290 return USEC_INFINITY
;
2295 initialize_perturb(e
);
2298 Find a good time to wake up again between times a and b. We
2299 have two goals here:
2301 a) We want to wake up as seldom as possible, hence prefer
2302 later times over earlier times.
2304 b) But if we have to wake up, then let's make sure to
2305 dispatch as much as possible on the entire system.
2307 We implement this by waking up everywhere at the same time
2308 within any given minute if we can, synchronised via the
2309 perturbation value determined from the boot ID. If we can't,
2310 then we try to find the same spot in every 10s, then 1s and
2311 then 250ms step. Otherwise, we pick the last possible time
2315 c
= (b
/ USEC_PER_MINUTE
) * USEC_PER_MINUTE
+ e
->perturb
;
2317 if (_unlikely_(c
< USEC_PER_MINUTE
))
2320 c
-= USEC_PER_MINUTE
;
2326 c
= (b
/ (USEC_PER_SEC
*10)) * (USEC_PER_SEC
*10) + (e
->perturb
% (USEC_PER_SEC
*10));
2328 if (_unlikely_(c
< USEC_PER_SEC
*10))
2331 c
-= USEC_PER_SEC
*10;
2337 c
= (b
/ USEC_PER_SEC
) * USEC_PER_SEC
+ (e
->perturb
% USEC_PER_SEC
);
2339 if (_unlikely_(c
< USEC_PER_SEC
))
2348 c
= (b
/ (USEC_PER_MSEC
*250)) * (USEC_PER_MSEC
*250) + (e
->perturb
% (USEC_PER_MSEC
*250));
2350 if (_unlikely_(c
< USEC_PER_MSEC
*250))
2353 c
-= USEC_PER_MSEC
*250;
2362 static int event_arm_timer(
2364 struct clock_data
*d
) {
2366 struct itimerspec its
= {};
2367 sd_event_source
*a
, *b
;
2374 if (!d
->needs_rearm
)
2377 d
->needs_rearm
= false;
2379 a
= prioq_peek(d
->earliest
);
2380 if (!a
|| a
->enabled
== SD_EVENT_OFF
|| a
->time
.next
== USEC_INFINITY
) {
2385 if (d
->next
== USEC_INFINITY
)
2389 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2393 d
->next
= USEC_INFINITY
;
2397 b
= prioq_peek(d
->latest
);
2398 assert_se(b
&& b
->enabled
!= SD_EVENT_OFF
);
2400 t
= sleep_between(e
, a
->time
.next
, time_event_source_latest(b
));
2404 assert_se(d
->fd
>= 0);
2407 /* We don' want to disarm here, just mean some time looooong ago. */
2408 its
.it_value
.tv_sec
= 0;
2409 its
.it_value
.tv_nsec
= 1;
2411 timespec_store(&its
.it_value
, t
);
2413 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2421 static int process_io(sd_event
*e
, sd_event_source
*s
, uint32_t revents
) {
2424 assert(s
->type
== SOURCE_IO
);
2426 /* If the event source was already pending, we just OR in the
2427 * new revents, otherwise we reset the value. The ORing is
2428 * necessary to handle EPOLLONESHOT events properly where
2429 * readability might happen independently of writability, and
2430 * we need to keep track of both */
2433 s
->io
.revents
|= revents
;
2435 s
->io
.revents
= revents
;
2437 return source_set_pending(s
, true);
2440 static int flush_timer(sd_event
*e
, int fd
, uint32_t events
, usec_t
*next
) {
2447 assert_return(events
== EPOLLIN
, -EIO
);
2449 ss
= read(fd
, &x
, sizeof(x
));
2451 if (IN_SET(errno
, EAGAIN
, EINTR
))
2457 if (_unlikely_(ss
!= sizeof(x
)))
2461 *next
= USEC_INFINITY
;
2466 static int process_timer(
2469 struct clock_data
*d
) {
2478 s
= prioq_peek(d
->earliest
);
2481 s
->enabled
== SD_EVENT_OFF
||
2485 r
= source_set_pending(s
, true);
2489 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2490 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2491 d
->needs_rearm
= true;
2497 static int process_child(sd_event
*e
) {
2504 e
->need_process_child
= false;
2507 So, this is ugly. We iteratively invoke waitid() with P_PID
2508 + WNOHANG for each PID we wait for, instead of using
2509 P_ALL. This is because we only want to get child
2510 information of very specific child processes, and not all
2511 of them. We might not have processed the SIGCHLD even of a
2512 previous invocation and we don't want to maintain a
2513 unbounded *per-child* event queue, hence we really don't
2514 want anything flushed out of the kernel's queue that we
2515 don't care about. Since this is O(n) this means that if you
2516 have a lot of processes you probably want to handle SIGCHLD
2519 We do not reap the children here (by using WNOWAIT), this
2520 is only done after the event source is dispatched so that
2521 the callback still sees the process as a zombie.
2524 HASHMAP_FOREACH(s
, e
->child_sources
, i
) {
2525 assert(s
->type
== SOURCE_CHILD
);
2530 if (s
->enabled
== SD_EVENT_OFF
)
2533 zero(s
->child
.siginfo
);
2534 r
= waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
,
2535 WNOHANG
| (s
->child
.options
& WEXITED
? WNOWAIT
: 0) | s
->child
.options
);
2539 if (s
->child
.siginfo
.si_pid
!= 0) {
2540 bool zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
2542 if (!zombie
&& (s
->child
.options
& WEXITED
)) {
2543 /* If the child isn't dead then let's
2544 * immediately remove the state change
2545 * from the queue, since there's no
2546 * benefit in leaving it queued */
2548 assert(s
->child
.options
& (WSTOPPED
|WCONTINUED
));
2549 waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|(s
->child
.options
& (WSTOPPED
|WCONTINUED
)));
2552 r
= source_set_pending(s
, true);
2561 static int process_signal(sd_event
*e
, struct signal_data
*d
, uint32_t events
) {
2562 bool read_one
= false;
2567 assert_return(events
== EPOLLIN
, -EIO
);
2569 /* If there's a signal queued on this priority and SIGCHLD is
2570 on this priority too, then make sure to recheck the
2571 children we watch. This is because we only ever dequeue
2572 the first signal per priority, and if we dequeue one, and
2573 SIGCHLD might be enqueued later we wouldn't know, but we
2574 might have higher priority children we care about hence we
2575 need to check that explicitly. */
2577 if (sigismember(&d
->sigset
, SIGCHLD
))
2578 e
->need_process_child
= true;
2580 /* If there's already an event source pending for this
2581 * priority we don't read another */
2586 struct signalfd_siginfo si
;
2588 sd_event_source
*s
= NULL
;
2590 n
= read(d
->fd
, &si
, sizeof(si
));
2592 if (IN_SET(errno
, EAGAIN
, EINTR
))
2598 if (_unlikely_(n
!= sizeof(si
)))
2601 assert(SIGNAL_VALID(si
.ssi_signo
));
2605 if (e
->signal_sources
)
2606 s
= e
->signal_sources
[si
.ssi_signo
];
2612 s
->signal
.siginfo
= si
;
2615 r
= source_set_pending(s
, true);
2623 static int event_inotify_data_read(sd_event
*e
, struct inotify_data
*d
, uint32_t revents
) {
2629 assert_return(revents
== EPOLLIN
, -EIO
);
2631 /* If there's already an event source pending for this priority, don't read another */
2632 if (d
->n_pending
> 0)
2635 /* Is the read buffer non-empty? If so, let's not read more */
2636 if (d
->buffer_filled
> 0)
2639 n
= read(d
->fd
, &d
->buffer
, sizeof(d
->buffer
));
2641 if (IN_SET(errno
, EAGAIN
, EINTR
))
2648 d
->buffer_filled
= (size_t) n
;
2649 LIST_PREPEND(buffered
, e
->inotify_data_buffered
, d
);
2654 static void event_inotify_data_drop(sd_event
*e
, struct inotify_data
*d
, size_t sz
) {
2657 assert(sz
<= d
->buffer_filled
);
2662 /* Move the rest to the buffer to the front, in order to get things properly aligned again */
2663 memmove(d
->buffer
.raw
, d
->buffer
.raw
+ sz
, d
->buffer_filled
- sz
);
2664 d
->buffer_filled
-= sz
;
2666 if (d
->buffer_filled
== 0)
2667 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
2670 static int event_inotify_data_process(sd_event
*e
, struct inotify_data
*d
) {
2676 /* If there's already an event source pending for this priority, don't read another */
2677 if (d
->n_pending
> 0)
2680 while (d
->buffer_filled
> 0) {
2683 /* Let's validate that the event structures are complete */
2684 if (d
->buffer_filled
< offsetof(struct inotify_event
, name
))
2687 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
2688 if (d
->buffer_filled
< sz
)
2691 if (d
->buffer
.ev
.mask
& IN_Q_OVERFLOW
) {
2692 struct inode_data
*inode_data
;
2695 /* The queue overran, let's pass this event to all event sources connected to this inotify
2698 HASHMAP_FOREACH(inode_data
, d
->inodes
, i
) {
2701 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
2703 if (s
->enabled
== SD_EVENT_OFF
)
2706 r
= source_set_pending(s
, true);
2712 struct inode_data
*inode_data
;
2715 /* Find the inode object for this watch descriptor. If IN_IGNORED is set we also remove it from
2716 * our watch descriptor table. */
2717 if (d
->buffer
.ev
.mask
& IN_IGNORED
) {
2719 inode_data
= hashmap_remove(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
2721 event_inotify_data_drop(e
, d
, sz
);
2725 /* The watch descriptor was removed by the kernel, let's drop it here too */
2726 inode_data
->wd
= -1;
2728 inode_data
= hashmap_get(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
2730 event_inotify_data_drop(e
, d
, sz
);
2735 /* Trigger all event sources that are interested in these events. Also trigger all event
2736 * sources if IN_IGNORED or IN_UNMOUNT is set. */
2737 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
2739 if (s
->enabled
== SD_EVENT_OFF
)
2742 if ((d
->buffer
.ev
.mask
& (IN_IGNORED
|IN_UNMOUNT
)) == 0 &&
2743 (s
->inotify
.mask
& d
->buffer
.ev
.mask
& IN_ALL_EVENTS
) == 0)
2746 r
= source_set_pending(s
, true);
2752 /* Something pending now? If so, let's finish, otherwise let's read more. */
2753 if (d
->n_pending
> 0)
2760 static int process_inotify(sd_event
*e
) {
2761 struct inotify_data
*d
;
2766 LIST_FOREACH(buffered
, d
, e
->inotify_data_buffered
) {
2767 r
= event_inotify_data_process(e
, d
);
2777 static int source_dispatch(sd_event_source
*s
) {
2778 EventSourceType saved_type
;
2782 assert(s
->pending
|| s
->type
== SOURCE_EXIT
);
2784 /* Save the event source type, here, so that we still know it after the event callback which might invalidate
2786 saved_type
= s
->type
;
2788 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2789 r
= source_set_pending(s
, false);
2794 if (s
->type
!= SOURCE_POST
) {
2798 /* If we execute a non-post source, let's mark all
2799 * post sources as pending */
2801 SET_FOREACH(z
, s
->event
->post_sources
, i
) {
2802 if (z
->enabled
== SD_EVENT_OFF
)
2805 r
= source_set_pending(z
, true);
2811 if (s
->enabled
== SD_EVENT_ONESHOT
) {
2812 r
= sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
2817 s
->dispatching
= true;
2822 r
= s
->io
.callback(s
, s
->io
.fd
, s
->io
.revents
, s
->userdata
);
2825 case SOURCE_TIME_REALTIME
:
2826 case SOURCE_TIME_BOOTTIME
:
2827 case SOURCE_TIME_MONOTONIC
:
2828 case SOURCE_TIME_REALTIME_ALARM
:
2829 case SOURCE_TIME_BOOTTIME_ALARM
:
2830 r
= s
->time
.callback(s
, s
->time
.next
, s
->userdata
);
2834 r
= s
->signal
.callback(s
, &s
->signal
.siginfo
, s
->userdata
);
2837 case SOURCE_CHILD
: {
2840 zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
2842 r
= s
->child
.callback(s
, &s
->child
.siginfo
, s
->userdata
);
2844 /* Now, reap the PID for good. */
2846 (void) waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|WEXITED
);
2852 r
= s
->defer
.callback(s
, s
->userdata
);
2856 r
= s
->post
.callback(s
, s
->userdata
);
2860 r
= s
->exit
.callback(s
, s
->userdata
);
2863 case SOURCE_INOTIFY
: {
2864 struct sd_event
*e
= s
->event
;
2865 struct inotify_data
*d
;
2868 assert(s
->inotify
.inode_data
);
2869 assert_se(d
= s
->inotify
.inode_data
->inotify_data
);
2871 assert(d
->buffer_filled
>= offsetof(struct inotify_event
, name
));
2872 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
2873 assert(d
->buffer_filled
>= sz
);
2875 r
= s
->inotify
.callback(s
, &d
->buffer
.ev
, s
->userdata
);
2877 /* When no event is pending anymore on this inotify object, then let's drop the event from the
2879 if (d
->n_pending
== 0)
2880 event_inotify_data_drop(e
, d
, sz
);
2885 case SOURCE_WATCHDOG
:
2886 case _SOURCE_EVENT_SOURCE_TYPE_MAX
:
2887 case _SOURCE_EVENT_SOURCE_TYPE_INVALID
:
2888 assert_not_reached("Wut? I shouldn't exist.");
2891 s
->dispatching
= false;
2894 log_debug_errno(r
, "Event source %s (type %s) returned error, disabling: %m",
2895 strna(s
->description
), event_source_type_to_string(saved_type
));
2900 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
2905 static int event_prepare(sd_event
*e
) {
2913 s
= prioq_peek(e
->prepare
);
2914 if (!s
|| s
->prepare_iteration
== e
->iteration
|| s
->enabled
== SD_EVENT_OFF
)
2917 s
->prepare_iteration
= e
->iteration
;
2918 r
= prioq_reshuffle(e
->prepare
, s
, &s
->prepare_index
);
2924 s
->dispatching
= true;
2925 r
= s
->prepare(s
, s
->userdata
);
2926 s
->dispatching
= false;
2929 log_debug_errno(r
, "Prepare callback of event source %s (type %s) returned error, disabling: %m",
2930 strna(s
->description
), event_source_type_to_string(s
->type
));
2935 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
2941 static int dispatch_exit(sd_event
*e
) {
2943 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
2948 p
= prioq_peek(e
->exit
);
2949 if (!p
|| p
->enabled
== SD_EVENT_OFF
) {
2950 e
->state
= SD_EVENT_FINISHED
;
2954 ref
= sd_event_ref(e
);
2956 e
->state
= SD_EVENT_EXITING
;
2957 r
= source_dispatch(p
);
2958 e
->state
= SD_EVENT_INITIAL
;
2962 static sd_event_source
* event_next_pending(sd_event
*e
) {
2967 p
= prioq_peek(e
->pending
);
2971 if (p
->enabled
== SD_EVENT_OFF
)
2977 static int arm_watchdog(sd_event
*e
) {
2978 struct itimerspec its
= {};
2983 assert(e
->watchdog_fd
>= 0);
2985 t
= sleep_between(e
,
2986 e
->watchdog_last
+ (e
->watchdog_period
/ 2),
2987 e
->watchdog_last
+ (e
->watchdog_period
* 3 / 4));
2989 timespec_store(&its
.it_value
, t
);
2991 /* Make sure we never set the watchdog to 0, which tells the
2992 * kernel to disable it. */
2993 if (its
.it_value
.tv_sec
== 0 && its
.it_value
.tv_nsec
== 0)
2994 its
.it_value
.tv_nsec
= 1;
2996 r
= timerfd_settime(e
->watchdog_fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
3003 static int process_watchdog(sd_event
*e
) {
3009 /* Don't notify watchdog too often */
3010 if (e
->watchdog_last
+ e
->watchdog_period
/ 4 > e
->timestamp
.monotonic
)
3013 sd_notify(false, "WATCHDOG=1");
3014 e
->watchdog_last
= e
->timestamp
.monotonic
;
3016 return arm_watchdog(e
);
3019 static void event_close_inode_data_fds(sd_event
*e
) {
3020 struct inode_data
*d
;
3024 /* Close the fds pointing to the inodes to watch now. We need to close them as they might otherwise pin
3025 * filesystems. But we can't close them right-away as we need them as long as the user still wants to make
3026 * adjustments to the even source, such as changing the priority (which requires us to remove and readd a watch
3027 * for the inode). Hence, let's close them when entering the first iteration after they were added, as a
3030 while ((d
= e
->inode_data_to_close
)) {
3032 d
->fd
= safe_close(d
->fd
);
3034 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
3038 _public_
int sd_event_prepare(sd_event
*e
) {
3041 assert_return(e
, -EINVAL
);
3042 assert_return(e
= event_resolve(e
), -ENOPKG
);
3043 assert_return(!event_pid_changed(e
), -ECHILD
);
3044 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3045 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3047 if (e
->exit_requested
)
3052 e
->state
= SD_EVENT_PREPARING
;
3053 r
= event_prepare(e
);
3054 e
->state
= SD_EVENT_INITIAL
;
3058 r
= event_arm_timer(e
, &e
->realtime
);
3062 r
= event_arm_timer(e
, &e
->boottime
);
3066 r
= event_arm_timer(e
, &e
->monotonic
);
3070 r
= event_arm_timer(e
, &e
->realtime_alarm
);
3074 r
= event_arm_timer(e
, &e
->boottime_alarm
);
3078 event_close_inode_data_fds(e
);
3080 if (event_next_pending(e
) || e
->need_process_child
)
3083 e
->state
= SD_EVENT_ARMED
;
3088 e
->state
= SD_EVENT_ARMED
;
3089 r
= sd_event_wait(e
, 0);
3091 e
->state
= SD_EVENT_ARMED
;
3096 _public_
int sd_event_wait(sd_event
*e
, uint64_t timeout
) {
3097 struct epoll_event
*ev_queue
;
3098 unsigned ev_queue_max
;
3101 assert_return(e
, -EINVAL
);
3102 assert_return(e
= event_resolve(e
), -ENOPKG
);
3103 assert_return(!event_pid_changed(e
), -ECHILD
);
3104 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3105 assert_return(e
->state
== SD_EVENT_ARMED
, -EBUSY
);
3107 if (e
->exit_requested
) {
3108 e
->state
= SD_EVENT_PENDING
;
3112 ev_queue_max
= MAX(e
->n_sources
, 1u);
3113 ev_queue
= newa(struct epoll_event
, ev_queue_max
);
3115 /* If we still have inotify data buffered, then query the other fds, but don't wait on it */
3116 if (e
->inotify_data_buffered
)
3119 m
= epoll_wait(e
->epoll_fd
, ev_queue
, ev_queue_max
,
3120 timeout
== (uint64_t) -1 ? -1 : (int) ((timeout
+ USEC_PER_MSEC
- 1) / USEC_PER_MSEC
));
3122 if (errno
== EINTR
) {
3123 e
->state
= SD_EVENT_PENDING
;
3131 triple_timestamp_get(&e
->timestamp
);
3133 for (i
= 0; i
< m
; i
++) {
3135 if (ev_queue
[i
].data
.ptr
== INT_TO_PTR(SOURCE_WATCHDOG
))
3136 r
= flush_timer(e
, e
->watchdog_fd
, ev_queue
[i
].events
, NULL
);
3138 WakeupType
*t
= ev_queue
[i
].data
.ptr
;
3142 case WAKEUP_EVENT_SOURCE
:
3143 r
= process_io(e
, ev_queue
[i
].data
.ptr
, ev_queue
[i
].events
);
3146 case WAKEUP_CLOCK_DATA
: {
3147 struct clock_data
*d
= ev_queue
[i
].data
.ptr
;
3148 r
= flush_timer(e
, d
->fd
, ev_queue
[i
].events
, &d
->next
);
3152 case WAKEUP_SIGNAL_DATA
:
3153 r
= process_signal(e
, ev_queue
[i
].data
.ptr
, ev_queue
[i
].events
);
3156 case WAKEUP_INOTIFY_DATA
:
3157 r
= event_inotify_data_read(e
, ev_queue
[i
].data
.ptr
, ev_queue
[i
].events
);
3161 assert_not_reached("Invalid wake-up pointer");
3168 r
= process_watchdog(e
);
3172 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime
);
3176 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime
);
3180 r
= process_timer(e
, e
->timestamp
.monotonic
, &e
->monotonic
);
3184 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime_alarm
);
3188 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime_alarm
);
3192 if (e
->need_process_child
) {
3193 r
= process_child(e
);
3198 r
= process_inotify(e
);
3202 if (event_next_pending(e
)) {
3203 e
->state
= SD_EVENT_PENDING
;
3211 e
->state
= SD_EVENT_INITIAL
;
3216 _public_
int sd_event_dispatch(sd_event
*e
) {
3220 assert_return(e
, -EINVAL
);
3221 assert_return(e
= event_resolve(e
), -ENOPKG
);
3222 assert_return(!event_pid_changed(e
), -ECHILD
);
3223 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3224 assert_return(e
->state
== SD_EVENT_PENDING
, -EBUSY
);
3226 if (e
->exit_requested
)
3227 return dispatch_exit(e
);
3229 p
= event_next_pending(e
);
3231 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3233 ref
= sd_event_ref(e
);
3234 e
->state
= SD_EVENT_RUNNING
;
3235 r
= source_dispatch(p
);
3236 e
->state
= SD_EVENT_INITIAL
;
3240 e
->state
= SD_EVENT_INITIAL
;
3245 static void event_log_delays(sd_event
*e
) {
3246 char b
[ELEMENTSOF(e
->delays
) * DECIMAL_STR_MAX(unsigned) + 1];
3250 for (i
= o
= 0; i
< ELEMENTSOF(e
->delays
); i
++) {
3251 o
+= snprintf(&b
[o
], sizeof(b
) - o
, "%u ", e
->delays
[i
]);
3254 log_debug("Event loop iterations: %.*s", o
, b
);
3257 _public_
int sd_event_run(sd_event
*e
, uint64_t timeout
) {
3260 assert_return(e
, -EINVAL
);
3261 assert_return(e
= event_resolve(e
), -ENOPKG
);
3262 assert_return(!event_pid_changed(e
), -ECHILD
);
3263 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3264 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3266 if (e
->profile_delays
&& e
->last_run
) {
3270 this_run
= now(CLOCK_MONOTONIC
);
3272 l
= u64log2(this_run
- e
->last_run
);
3273 assert(l
< sizeof(e
->delays
));
3276 if (this_run
- e
->last_log
>= 5*USEC_PER_SEC
) {
3277 event_log_delays(e
);
3278 e
->last_log
= this_run
;
3282 r
= sd_event_prepare(e
);
3284 /* There was nothing? Then wait... */
3285 r
= sd_event_wait(e
, timeout
);
3287 if (e
->profile_delays
)
3288 e
->last_run
= now(CLOCK_MONOTONIC
);
3291 /* There's something now, then let's dispatch it */
3292 r
= sd_event_dispatch(e
);
3302 _public_
int sd_event_loop(sd_event
*e
) {
3303 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3306 assert_return(e
, -EINVAL
);
3307 assert_return(e
= event_resolve(e
), -ENOPKG
);
3308 assert_return(!event_pid_changed(e
), -ECHILD
);
3309 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3311 ref
= sd_event_ref(e
);
3313 while (e
->state
!= SD_EVENT_FINISHED
) {
3314 r
= sd_event_run(e
, (uint64_t) -1);
3319 return e
->exit_code
;
3322 _public_
int sd_event_get_fd(sd_event
*e
) {
3324 assert_return(e
, -EINVAL
);
3325 assert_return(e
= event_resolve(e
), -ENOPKG
);
3326 assert_return(!event_pid_changed(e
), -ECHILD
);
3331 _public_
int sd_event_get_state(sd_event
*e
) {
3332 assert_return(e
, -EINVAL
);
3333 assert_return(e
= event_resolve(e
), -ENOPKG
);
3334 assert_return(!event_pid_changed(e
), -ECHILD
);
3339 _public_
int sd_event_get_exit_code(sd_event
*e
, int *code
) {
3340 assert_return(e
, -EINVAL
);
3341 assert_return(e
= event_resolve(e
), -ENOPKG
);
3342 assert_return(code
, -EINVAL
);
3343 assert_return(!event_pid_changed(e
), -ECHILD
);
3345 if (!e
->exit_requested
)
3348 *code
= e
->exit_code
;
3352 _public_
int sd_event_exit(sd_event
*e
, int code
) {
3353 assert_return(e
, -EINVAL
);
3354 assert_return(e
= event_resolve(e
), -ENOPKG
);
3355 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3356 assert_return(!event_pid_changed(e
), -ECHILD
);
3358 e
->exit_requested
= true;
3359 e
->exit_code
= code
;
3364 _public_
int sd_event_now(sd_event
*e
, clockid_t clock
, uint64_t *usec
) {
3365 assert_return(e
, -EINVAL
);
3366 assert_return(e
= event_resolve(e
), -ENOPKG
);
3367 assert_return(usec
, -EINVAL
);
3368 assert_return(!event_pid_changed(e
), -ECHILD
);
3370 if (!TRIPLE_TIMESTAMP_HAS_CLOCK(clock
))
3373 /* Generate a clean error in case CLOCK_BOOTTIME is not available. Note that don't use clock_supported() here,
3374 * for a reason: there are systems where CLOCK_BOOTTIME is supported, but CLOCK_BOOTTIME_ALARM is not, but for
3375 * the purpose of getting the time this doesn't matter. */
3376 if (IN_SET(clock
, CLOCK_BOOTTIME
, CLOCK_BOOTTIME_ALARM
) && !clock_boottime_supported())
3379 if (!triple_timestamp_is_set(&e
->timestamp
)) {
3380 /* Implicitly fall back to now() if we never ran
3381 * before and thus have no cached time. */
3386 *usec
= triple_timestamp_by_clock(&e
->timestamp
, clock
);
3390 _public_
int sd_event_default(sd_event
**ret
) {
3395 return !!default_event
;
3397 if (default_event
) {
3398 *ret
= sd_event_ref(default_event
);
3402 r
= sd_event_new(&e
);
3406 e
->default_event_ptr
= &default_event
;
3414 _public_
int sd_event_get_tid(sd_event
*e
, pid_t
*tid
) {
3415 assert_return(e
, -EINVAL
);
3416 assert_return(e
= event_resolve(e
), -ENOPKG
);
3417 assert_return(tid
, -EINVAL
);
3418 assert_return(!event_pid_changed(e
), -ECHILD
);
3428 _public_
int sd_event_set_watchdog(sd_event
*e
, int b
) {
3431 assert_return(e
, -EINVAL
);
3432 assert_return(e
= event_resolve(e
), -ENOPKG
);
3433 assert_return(!event_pid_changed(e
), -ECHILD
);
3435 if (e
->watchdog
== !!b
)
3439 struct epoll_event ev
;
3441 r
= sd_watchdog_enabled(false, &e
->watchdog_period
);
3445 /* Issue first ping immediately */
3446 sd_notify(false, "WATCHDOG=1");
3447 e
->watchdog_last
= now(CLOCK_MONOTONIC
);
3449 e
->watchdog_fd
= timerfd_create(CLOCK_MONOTONIC
, TFD_NONBLOCK
|TFD_CLOEXEC
);
3450 if (e
->watchdog_fd
< 0)
3453 r
= arm_watchdog(e
);
3457 ev
= (struct epoll_event
) {
3459 .data
.ptr
= INT_TO_PTR(SOURCE_WATCHDOG
),
3462 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, e
->watchdog_fd
, &ev
);
3469 if (e
->watchdog_fd
>= 0) {
3470 epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, e
->watchdog_fd
, NULL
);
3471 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3479 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3483 _public_
int sd_event_get_watchdog(sd_event
*e
) {
3484 assert_return(e
, -EINVAL
);
3485 assert_return(e
= event_resolve(e
), -ENOPKG
);
3486 assert_return(!event_pid_changed(e
), -ECHILD
);
3491 _public_
int sd_event_get_iteration(sd_event
*e
, uint64_t *ret
) {
3492 assert_return(e
, -EINVAL
);
3493 assert_return(e
= event_resolve(e
), -ENOPKG
);
3494 assert_return(!event_pid_changed(e
), -ECHILD
);
3496 *ret
= e
->iteration
;
3500 _public_
int sd_event_source_set_destroy_callback(sd_event_source
*s
, sd_event_destroy_t callback
) {
3501 assert_return(s
, -EINVAL
);
3503 s
->destroy_callback
= callback
;
3507 _public_
int sd_event_source_get_destroy_callback(sd_event_source
*s
, sd_event_destroy_t
*ret
) {
3508 assert_return(s
, -EINVAL
);
3511 *ret
= s
->destroy_callback
;
3513 return !!s
->destroy_callback
;
3516 _public_
int sd_event_source_get_floating(sd_event_source
*s
) {
3517 assert_return(s
, -EINVAL
);
3522 _public_
int sd_event_source_set_floating(sd_event_source
*s
, int b
) {
3523 assert_return(s
, -EINVAL
);
3525 if (s
->floating
== !!b
)
3528 if (!s
->event
) /* Already disconnected */
3534 sd_event_source_ref(s
);
3535 sd_event_unref(s
->event
);
3537 sd_event_ref(s
->event
);
3538 sd_event_source_unref(s
);