1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include <sys/timerfd.h>
11 #include "alloc-util.h"
13 #include "event-source.h"
19 #include "memory-util.h"
20 #include "missing_syscall.h"
22 #include "process-util.h"
24 #include "signal-util.h"
25 #include "string-table.h"
26 #include "string-util.h"
28 #include "time-util.h"
30 #define DEFAULT_ACCURACY_USEC (250 * USEC_PER_MSEC)
32 static bool EVENT_SOURCE_WATCH_PIDFD(sd_event_source
*s
) {
33 /* Returns true if this is a PID event source and can be implemented by watching EPOLLIN */
35 s
->type
== SOURCE_CHILD
&&
36 s
->child
.pidfd
>= 0 &&
37 s
->child
.options
== WEXITED
;
40 static const char* const event_source_type_table
[_SOURCE_EVENT_SOURCE_TYPE_MAX
] = {
42 [SOURCE_TIME_REALTIME
] = "realtime",
43 [SOURCE_TIME_BOOTTIME
] = "bootime",
44 [SOURCE_TIME_MONOTONIC
] = "monotonic",
45 [SOURCE_TIME_REALTIME_ALARM
] = "realtime-alarm",
46 [SOURCE_TIME_BOOTTIME_ALARM
] = "boottime-alarm",
47 [SOURCE_SIGNAL
] = "signal",
48 [SOURCE_CHILD
] = "child",
49 [SOURCE_DEFER
] = "defer",
50 [SOURCE_POST
] = "post",
51 [SOURCE_EXIT
] = "exit",
52 [SOURCE_WATCHDOG
] = "watchdog",
53 [SOURCE_INOTIFY
] = "inotify",
56 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(event_source_type
, int);
58 #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)
69 /* timerfd_create() only supports these five clocks so far. We
70 * can add support for more clocks when the kernel learns to
71 * deal with them, too. */
72 struct clock_data realtime
;
73 struct clock_data boottime
;
74 struct clock_data monotonic
;
75 struct clock_data realtime_alarm
;
76 struct clock_data boottime_alarm
;
80 sd_event_source
**signal_sources
; /* indexed by signal number */
81 Hashmap
*signal_data
; /* indexed by priority */
83 Hashmap
*child_sources
;
84 unsigned n_enabled_child_sources
;
90 Hashmap
*inotify_data
; /* indexed by priority */
92 /* A list of inode structures that still have an fd open, that we need to close before the next loop iteration */
93 LIST_HEAD(struct inode_data
, inode_data_to_close
);
95 /* A list of inotify objects that already have events buffered which aren't processed yet */
96 LIST_HEAD(struct inotify_data
, inotify_data_buffered
);
101 triple_timestamp timestamp
;
104 bool exit_requested
:1;
105 bool need_process_child
:1;
107 bool profile_delays
:1;
112 sd_event
**default_event_ptr
;
114 usec_t watchdog_last
, watchdog_period
;
118 LIST_HEAD(sd_event_source
, sources
);
120 usec_t last_run
, last_log
;
121 unsigned delays
[sizeof(usec_t
) * 8];
124 static thread_local sd_event
*default_event
= NULL
;
126 static void source_disconnect(sd_event_source
*s
);
127 static void event_gc_inode_data(sd_event
*e
, struct inode_data
*d
);
129 static sd_event
*event_resolve(sd_event
*e
) {
130 return e
== SD_EVENT_DEFAULT
? default_event
: e
;
133 static int pending_prioq_compare(const void *a
, const void *b
) {
134 const sd_event_source
*x
= a
, *y
= b
;
140 /* Enabled ones first */
141 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
143 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
146 /* Lower priority values first */
147 r
= CMP(x
->priority
, y
->priority
);
151 /* Older entries first */
152 return CMP(x
->pending_iteration
, y
->pending_iteration
);
155 static int prepare_prioq_compare(const void *a
, const void *b
) {
156 const sd_event_source
*x
= a
, *y
= b
;
162 /* Enabled ones first */
163 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
165 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
168 /* Move most recently prepared ones last, so that we can stop
169 * preparing as soon as we hit one that has already been
170 * prepared in the current iteration */
171 r
= CMP(x
->prepare_iteration
, y
->prepare_iteration
);
175 /* Lower priority values first */
176 return CMP(x
->priority
, y
->priority
);
179 static int earliest_time_prioq_compare(const void *a
, const void *b
) {
180 const sd_event_source
*x
= a
, *y
= b
;
182 assert(EVENT_SOURCE_IS_TIME(x
->type
));
183 assert(x
->type
== y
->type
);
185 /* Enabled ones first */
186 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
188 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
191 /* Move the pending ones to the end */
192 if (!x
->pending
&& y
->pending
)
194 if (x
->pending
&& !y
->pending
)
198 return CMP(x
->time
.next
, y
->time
.next
);
201 static usec_t
time_event_source_latest(const sd_event_source
*s
) {
202 return usec_add(s
->time
.next
, s
->time
.accuracy
);
205 static int latest_time_prioq_compare(const void *a
, const void *b
) {
206 const sd_event_source
*x
= a
, *y
= b
;
208 assert(EVENT_SOURCE_IS_TIME(x
->type
));
209 assert(x
->type
== y
->type
);
211 /* Enabled ones first */
212 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
214 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
217 /* Move the pending ones to the end */
218 if (!x
->pending
&& y
->pending
)
220 if (x
->pending
&& !y
->pending
)
224 return CMP(time_event_source_latest(x
), time_event_source_latest(y
));
227 static int exit_prioq_compare(const void *a
, const void *b
) {
228 const sd_event_source
*x
= a
, *y
= b
;
230 assert(x
->type
== SOURCE_EXIT
);
231 assert(y
->type
== SOURCE_EXIT
);
233 /* Enabled ones first */
234 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
236 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
239 /* Lower priority values first */
240 return CMP(x
->priority
, y
->priority
);
243 static void free_clock_data(struct clock_data
*d
) {
245 assert(d
->wakeup
== WAKEUP_CLOCK_DATA
);
248 prioq_free(d
->earliest
);
249 prioq_free(d
->latest
);
252 static sd_event
*event_free(sd_event
*e
) {
257 while ((s
= e
->sources
)) {
259 source_disconnect(s
);
260 sd_event_source_unref(s
);
263 assert(e
->n_sources
== 0);
265 if (e
->default_event_ptr
)
266 *(e
->default_event_ptr
) = NULL
;
268 safe_close(e
->epoll_fd
);
269 safe_close(e
->watchdog_fd
);
271 free_clock_data(&e
->realtime
);
272 free_clock_data(&e
->boottime
);
273 free_clock_data(&e
->monotonic
);
274 free_clock_data(&e
->realtime_alarm
);
275 free_clock_data(&e
->boottime_alarm
);
277 prioq_free(e
->pending
);
278 prioq_free(e
->prepare
);
281 free(e
->signal_sources
);
282 hashmap_free(e
->signal_data
);
284 hashmap_free(e
->inotify_data
);
286 hashmap_free(e
->child_sources
);
287 set_free(e
->post_sources
);
292 _public_
int sd_event_new(sd_event
** ret
) {
296 assert_return(ret
, -EINVAL
);
298 e
= new(sd_event
, 1);
306 .realtime
.wakeup
= WAKEUP_CLOCK_DATA
,
308 .realtime
.next
= USEC_INFINITY
,
309 .boottime
.wakeup
= WAKEUP_CLOCK_DATA
,
311 .boottime
.next
= USEC_INFINITY
,
312 .monotonic
.wakeup
= WAKEUP_CLOCK_DATA
,
314 .monotonic
.next
= USEC_INFINITY
,
315 .realtime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
316 .realtime_alarm
.fd
= -1,
317 .realtime_alarm
.next
= USEC_INFINITY
,
318 .boottime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
319 .boottime_alarm
.fd
= -1,
320 .boottime_alarm
.next
= USEC_INFINITY
,
321 .perturb
= USEC_INFINITY
,
322 .original_pid
= getpid_cached(),
325 r
= prioq_ensure_allocated(&e
->pending
, pending_prioq_compare
);
329 e
->epoll_fd
= epoll_create1(EPOLL_CLOEXEC
);
330 if (e
->epoll_fd
< 0) {
335 e
->epoll_fd
= fd_move_above_stdio(e
->epoll_fd
);
337 if (secure_getenv("SD_EVENT_PROFILE_DELAYS")) {
338 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.");
339 e
->profile_delays
= true;
350 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event
, sd_event
, event_free
);
352 _public_ sd_event_source
* sd_event_source_disable_unref(sd_event_source
*s
) {
354 (void) sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
355 return sd_event_source_unref(s
);
358 static bool event_pid_changed(sd_event
*e
) {
361 /* We don't support people creating an event loop and keeping
362 * it around over a fork(). Let's complain. */
364 return e
->original_pid
!= getpid_cached();
367 static void source_io_unregister(sd_event_source
*s
) {
369 assert(s
->type
== SOURCE_IO
);
371 if (event_pid_changed(s
->event
))
374 if (!s
->io
.registered
)
377 if (epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, s
->io
.fd
, NULL
) < 0)
378 log_debug_errno(errno
, "Failed to remove source %s (type %s) from epoll: %m",
379 strna(s
->description
), event_source_type_to_string(s
->type
));
381 s
->io
.registered
= false;
384 static int source_io_register(
389 struct epoll_event ev
;
393 assert(s
->type
== SOURCE_IO
);
394 assert(enabled
!= SD_EVENT_OFF
);
396 ev
= (struct epoll_event
) {
397 .events
= events
| (enabled
== SD_EVENT_ONESHOT
? EPOLLONESHOT
: 0),
401 if (s
->io
.registered
)
402 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_MOD
, s
->io
.fd
, &ev
);
404 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_ADD
, s
->io
.fd
, &ev
);
408 s
->io
.registered
= true;
413 static void source_child_pidfd_unregister(sd_event_source
*s
) {
415 assert(s
->type
== SOURCE_CHILD
);
417 if (event_pid_changed(s
->event
))
420 if (!s
->child
.registered
)
423 if (EVENT_SOURCE_WATCH_PIDFD(s
))
424 if (epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, s
->child
.pidfd
, NULL
) < 0)
425 log_debug_errno(errno
, "Failed to remove source %s (type %s) from epoll: %m",
426 strna(s
->description
), event_source_type_to_string(s
->type
));
428 s
->child
.registered
= false;
431 static int source_child_pidfd_register(sd_event_source
*s
, int enabled
) {
435 assert(s
->type
== SOURCE_CHILD
);
436 assert(enabled
!= SD_EVENT_OFF
);
438 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
439 struct epoll_event ev
;
441 ev
= (struct epoll_event
) {
442 .events
= EPOLLIN
| (enabled
== SD_EVENT_ONESHOT
? EPOLLONESHOT
: 0),
446 if (s
->child
.registered
)
447 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_MOD
, s
->child
.pidfd
, &ev
);
449 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_ADD
, s
->child
.pidfd
, &ev
);
454 s
->child
.registered
= true;
458 static clockid_t
event_source_type_to_clock(EventSourceType t
) {
462 case SOURCE_TIME_REALTIME
:
463 return CLOCK_REALTIME
;
465 case SOURCE_TIME_BOOTTIME
:
466 return CLOCK_BOOTTIME
;
468 case SOURCE_TIME_MONOTONIC
:
469 return CLOCK_MONOTONIC
;
471 case SOURCE_TIME_REALTIME_ALARM
:
472 return CLOCK_REALTIME_ALARM
;
474 case SOURCE_TIME_BOOTTIME_ALARM
:
475 return CLOCK_BOOTTIME_ALARM
;
478 return (clockid_t
) -1;
482 static EventSourceType
clock_to_event_source_type(clockid_t clock
) {
487 return SOURCE_TIME_REALTIME
;
490 return SOURCE_TIME_BOOTTIME
;
492 case CLOCK_MONOTONIC
:
493 return SOURCE_TIME_MONOTONIC
;
495 case CLOCK_REALTIME_ALARM
:
496 return SOURCE_TIME_REALTIME_ALARM
;
498 case CLOCK_BOOTTIME_ALARM
:
499 return SOURCE_TIME_BOOTTIME_ALARM
;
502 return _SOURCE_EVENT_SOURCE_TYPE_INVALID
;
506 static struct clock_data
* event_get_clock_data(sd_event
*e
, EventSourceType t
) {
511 case SOURCE_TIME_REALTIME
:
514 case SOURCE_TIME_BOOTTIME
:
517 case SOURCE_TIME_MONOTONIC
:
518 return &e
->monotonic
;
520 case SOURCE_TIME_REALTIME_ALARM
:
521 return &e
->realtime_alarm
;
523 case SOURCE_TIME_BOOTTIME_ALARM
:
524 return &e
->boottime_alarm
;
531 static void event_free_signal_data(sd_event
*e
, struct signal_data
*d
) {
537 hashmap_remove(e
->signal_data
, &d
->priority
);
542 static int event_make_signal_data(
545 struct signal_data
**ret
) {
547 struct epoll_event ev
;
548 struct signal_data
*d
;
556 if (event_pid_changed(e
))
559 if (e
->signal_sources
&& e
->signal_sources
[sig
])
560 priority
= e
->signal_sources
[sig
]->priority
;
562 priority
= SD_EVENT_PRIORITY_NORMAL
;
564 d
= hashmap_get(e
->signal_data
, &priority
);
566 if (sigismember(&d
->sigset
, sig
) > 0) {
572 r
= hashmap_ensure_allocated(&e
->signal_data
, &uint64_hash_ops
);
576 d
= new(struct signal_data
, 1);
580 *d
= (struct signal_data
) {
581 .wakeup
= WAKEUP_SIGNAL_DATA
,
583 .priority
= priority
,
586 r
= hashmap_put(e
->signal_data
, &d
->priority
, d
);
596 assert_se(sigaddset(&ss_copy
, sig
) >= 0);
598 r
= signalfd(d
->fd
, &ss_copy
, SFD_NONBLOCK
|SFD_CLOEXEC
);
612 d
->fd
= fd_move_above_stdio(r
);
614 ev
= (struct epoll_event
) {
619 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
);
632 event_free_signal_data(e
, d
);
637 static void event_unmask_signal_data(sd_event
*e
, struct signal_data
*d
, int sig
) {
641 /* Turns off the specified signal in the signal data
642 * object. If the signal mask of the object becomes empty that
645 if (sigismember(&d
->sigset
, sig
) == 0)
648 assert_se(sigdelset(&d
->sigset
, sig
) >= 0);
650 if (sigisemptyset(&d
->sigset
)) {
651 /* If all the mask is all-zero we can get rid of the structure */
652 event_free_signal_data(e
, d
);
658 if (signalfd(d
->fd
, &d
->sigset
, SFD_NONBLOCK
|SFD_CLOEXEC
) < 0)
659 log_debug_errno(errno
, "Failed to unset signal bit, ignoring: %m");
662 static void event_gc_signal_data(sd_event
*e
, const int64_t *priority
, int sig
) {
663 struct signal_data
*d
;
664 static const int64_t zero_priority
= 0;
668 /* Rechecks if the specified signal is still something we are interested in. If not, we'll unmask it,
669 * and possibly drop the signalfd for it. */
671 if (sig
== SIGCHLD
&&
672 e
->n_enabled_child_sources
> 0)
675 if (e
->signal_sources
&&
676 e
->signal_sources
[sig
] &&
677 e
->signal_sources
[sig
]->enabled
!= SD_EVENT_OFF
)
681 * The specified signal might be enabled in three different queues:
683 * 1) the one that belongs to the priority passed (if it is non-NULL)
684 * 2) the one that belongs to the priority of the event source of the signal (if there is one)
685 * 3) the 0 priority (to cover the SIGCHLD case)
687 * Hence, let's remove it from all three here.
691 d
= hashmap_get(e
->signal_data
, priority
);
693 event_unmask_signal_data(e
, d
, sig
);
696 if (e
->signal_sources
&& e
->signal_sources
[sig
]) {
697 d
= hashmap_get(e
->signal_data
, &e
->signal_sources
[sig
]->priority
);
699 event_unmask_signal_data(e
, d
, sig
);
702 d
= hashmap_get(e
->signal_data
, &zero_priority
);
704 event_unmask_signal_data(e
, d
, sig
);
707 static void source_disconnect(sd_event_source
*s
) {
715 assert(s
->event
->n_sources
> 0);
721 source_io_unregister(s
);
725 case SOURCE_TIME_REALTIME
:
726 case SOURCE_TIME_BOOTTIME
:
727 case SOURCE_TIME_MONOTONIC
:
728 case SOURCE_TIME_REALTIME_ALARM
:
729 case SOURCE_TIME_BOOTTIME_ALARM
: {
730 struct clock_data
*d
;
732 d
= event_get_clock_data(s
->event
, s
->type
);
735 prioq_remove(d
->earliest
, s
, &s
->time
.earliest_index
);
736 prioq_remove(d
->latest
, s
, &s
->time
.latest_index
);
737 d
->needs_rearm
= true;
742 if (s
->signal
.sig
> 0) {
744 if (s
->event
->signal_sources
)
745 s
->event
->signal_sources
[s
->signal
.sig
] = NULL
;
747 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
753 if (s
->child
.pid
> 0) {
754 if (s
->enabled
!= SD_EVENT_OFF
) {
755 assert(s
->event
->n_enabled_child_sources
> 0);
756 s
->event
->n_enabled_child_sources
--;
759 (void) hashmap_remove(s
->event
->child_sources
, PID_TO_PTR(s
->child
.pid
));
762 if (EVENT_SOURCE_WATCH_PIDFD(s
))
763 source_child_pidfd_unregister(s
);
765 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
774 set_remove(s
->event
->post_sources
, s
);
778 prioq_remove(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
781 case SOURCE_INOTIFY
: {
782 struct inode_data
*inode_data
;
784 inode_data
= s
->inotify
.inode_data
;
786 struct inotify_data
*inotify_data
;
787 assert_se(inotify_data
= inode_data
->inotify_data
);
789 /* Detach this event source from the inode object */
790 LIST_REMOVE(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
791 s
->inotify
.inode_data
= NULL
;
794 assert(inotify_data
->n_pending
> 0);
795 inotify_data
->n_pending
--;
798 /* Note that we don't reduce the inotify mask for the watch descriptor here if the inode is
799 * continued to being watched. That's because inotify doesn't really have an API for that: we
800 * can only change watch masks with access to the original inode either by fd or by path. But
801 * paths aren't stable, and keeping an O_PATH fd open all the time would mean wasting an fd
802 * continuously and keeping the mount busy which we can't really do. We could reconstruct the
803 * original inode from /proc/self/fdinfo/$INOTIFY_FD (as all watch descriptors are listed
804 * there), but given the need for open_by_handle_at() which is privileged and not universally
805 * available this would be quite an incomplete solution. Hence we go the other way, leave the
806 * mask set, even if it is not minimized now, and ignore all events we aren't interested in
807 * anymore after reception. Yes, this sucks, but … Linux … */
809 /* Maybe release the inode data (and its inotify) */
810 event_gc_inode_data(s
->event
, inode_data
);
817 assert_not_reached("Wut? I shouldn't exist.");
821 prioq_remove(s
->event
->pending
, s
, &s
->pending_index
);
824 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
829 LIST_REMOVE(sources
, event
->sources
, s
);
832 /* Note that we don't invalidate the type here, since we still need it in order to close the fd or
833 * pidfd associated with this event source, which we'll do only on source_free(). */
836 sd_event_unref(event
);
839 static void source_free(sd_event_source
*s
) {
842 source_disconnect(s
);
844 if (s
->type
== SOURCE_IO
&& s
->io
.owned
)
845 s
->io
.fd
= safe_close(s
->io
.fd
);
847 if (s
->type
== SOURCE_CHILD
) {
848 /* Eventually the kernel will do this automatically for us, but for now let's emulate this (unreliably) in userspace. */
850 if (s
->child
.process_owned
) {
852 if (!s
->child
.exited
) {
855 if (s
->child
.pidfd
>= 0) {
856 if (pidfd_send_signal(s
->child
.pidfd
, SIGKILL
, NULL
, 0) < 0) {
857 if (errno
== ESRCH
) /* Already dead */
859 else if (!ERRNO_IS_NOT_SUPPORTED(errno
))
860 log_debug_errno(errno
, "Failed to kill process " PID_FMT
" via pidfd_send_signal(), re-trying via kill(): %m",
867 if (kill(s
->child
.pid
, SIGKILL
) < 0)
868 if (errno
!= ESRCH
) /* Already dead */
869 log_debug_errno(errno
, "Failed to kill process " PID_FMT
" via kill(), ignoring: %m",
873 if (!s
->child
.waited
) {
876 /* Reap the child if we can */
877 (void) waitid(P_PID
, s
->child
.pid
, &si
, WEXITED
);
881 if (s
->child
.pidfd_owned
)
882 s
->child
.pidfd
= safe_close(s
->child
.pidfd
);
885 if (s
->destroy_callback
)
886 s
->destroy_callback(s
->userdata
);
888 free(s
->description
);
891 DEFINE_TRIVIAL_CLEANUP_FUNC(sd_event_source
*, source_free
);
893 static int source_set_pending(sd_event_source
*s
, bool b
) {
897 assert(s
->type
!= SOURCE_EXIT
);
905 s
->pending_iteration
= s
->event
->iteration
;
907 r
= prioq_put(s
->event
->pending
, s
, &s
->pending_index
);
913 assert_se(prioq_remove(s
->event
->pending
, s
, &s
->pending_index
));
915 if (EVENT_SOURCE_IS_TIME(s
->type
)) {
916 struct clock_data
*d
;
918 d
= event_get_clock_data(s
->event
, s
->type
);
921 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
922 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
923 d
->needs_rearm
= true;
926 if (s
->type
== SOURCE_SIGNAL
&& !b
) {
927 struct signal_data
*d
;
929 d
= hashmap_get(s
->event
->signal_data
, &s
->priority
);
930 if (d
&& d
->current
== s
)
934 if (s
->type
== SOURCE_INOTIFY
) {
936 assert(s
->inotify
.inode_data
);
937 assert(s
->inotify
.inode_data
->inotify_data
);
940 s
->inotify
.inode_data
->inotify_data
->n_pending
++;
942 assert(s
->inotify
.inode_data
->inotify_data
->n_pending
> 0);
943 s
->inotify
.inode_data
->inotify_data
->n_pending
--;
950 static sd_event_source
*source_new(sd_event
*e
, bool floating
, EventSourceType type
) {
955 s
= new(sd_event_source
, 1);
959 *s
= (struct sd_event_source
) {
962 .floating
= floating
,
964 .pending_index
= PRIOQ_IDX_NULL
,
965 .prepare_index
= PRIOQ_IDX_NULL
,
971 LIST_PREPEND(sources
, e
->sources
, s
);
977 _public_
int sd_event_add_io(
979 sd_event_source
**ret
,
982 sd_event_io_handler_t callback
,
985 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
988 assert_return(e
, -EINVAL
);
989 assert_return(e
= event_resolve(e
), -ENOPKG
);
990 assert_return(fd
>= 0, -EBADF
);
991 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
992 assert_return(callback
, -EINVAL
);
993 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
994 assert_return(!event_pid_changed(e
), -ECHILD
);
996 s
= source_new(e
, !ret
, SOURCE_IO
);
1000 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1002 s
->io
.events
= events
;
1003 s
->io
.callback
= callback
;
1004 s
->userdata
= userdata
;
1005 s
->enabled
= SD_EVENT_ON
;
1007 r
= source_io_register(s
, s
->enabled
, events
);
1018 static void initialize_perturb(sd_event
*e
) {
1019 sd_id128_t bootid
= {};
1021 /* When we sleep for longer, we try to realign the wakeup to
1022 the same time within each minute/second/250ms, so that
1023 events all across the system can be coalesced into a single
1024 CPU wakeup. However, let's take some system-specific
1025 randomness for this value, so that in a network of systems
1026 with synced clocks timer events are distributed a
1027 bit. Here, we calculate a perturbation usec offset from the
1030 if (_likely_(e
->perturb
!= USEC_INFINITY
))
1033 if (sd_id128_get_boot(&bootid
) >= 0)
1034 e
->perturb
= (bootid
.qwords
[0] ^ bootid
.qwords
[1]) % USEC_PER_MINUTE
;
1037 static int event_setup_timer_fd(
1039 struct clock_data
*d
,
1042 struct epoll_event ev
;
1048 if (_likely_(d
->fd
>= 0))
1051 fd
= timerfd_create(clock
, TFD_NONBLOCK
|TFD_CLOEXEC
);
1055 fd
= fd_move_above_stdio(fd
);
1057 ev
= (struct epoll_event
) {
1062 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, fd
, &ev
);
1072 static int time_exit_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
1075 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
1078 _public_
int sd_event_add_time(
1080 sd_event_source
**ret
,
1084 sd_event_time_handler_t callback
,
1087 EventSourceType type
;
1088 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1089 struct clock_data
*d
;
1092 assert_return(e
, -EINVAL
);
1093 assert_return(e
= event_resolve(e
), -ENOPKG
);
1094 assert_return(accuracy
!= (uint64_t) -1, -EINVAL
);
1095 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1096 assert_return(!event_pid_changed(e
), -ECHILD
);
1098 if (!clock_supported(clock
)) /* Checks whether the kernel supports the clock */
1101 type
= clock_to_event_source_type(clock
); /* checks whether sd-event supports this clock */
1106 callback
= time_exit_callback
;
1108 d
= event_get_clock_data(e
, type
);
1111 r
= prioq_ensure_allocated(&d
->earliest
, earliest_time_prioq_compare
);
1115 r
= prioq_ensure_allocated(&d
->latest
, latest_time_prioq_compare
);
1120 r
= event_setup_timer_fd(e
, d
, clock
);
1125 s
= source_new(e
, !ret
, type
);
1129 s
->time
.next
= usec
;
1130 s
->time
.accuracy
= accuracy
== 0 ? DEFAULT_ACCURACY_USEC
: accuracy
;
1131 s
->time
.callback
= callback
;
1132 s
->time
.earliest_index
= s
->time
.latest_index
= PRIOQ_IDX_NULL
;
1133 s
->userdata
= userdata
;
1134 s
->enabled
= SD_EVENT_ONESHOT
;
1136 d
->needs_rearm
= true;
1138 r
= prioq_put(d
->earliest
, s
, &s
->time
.earliest_index
);
1142 r
= prioq_put(d
->latest
, s
, &s
->time
.latest_index
);
1153 static int signal_exit_callback(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1156 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
1159 _public_
int sd_event_add_signal(
1161 sd_event_source
**ret
,
1163 sd_event_signal_handler_t callback
,
1166 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1167 struct signal_data
*d
;
1170 assert_return(e
, -EINVAL
);
1171 assert_return(e
= event_resolve(e
), -ENOPKG
);
1172 assert_return(SIGNAL_VALID(sig
), -EINVAL
);
1173 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1174 assert_return(!event_pid_changed(e
), -ECHILD
);
1177 callback
= signal_exit_callback
;
1179 r
= signal_is_blocked(sig
);
1185 if (!e
->signal_sources
) {
1186 e
->signal_sources
= new0(sd_event_source
*, _NSIG
);
1187 if (!e
->signal_sources
)
1189 } else if (e
->signal_sources
[sig
])
1192 s
= source_new(e
, !ret
, SOURCE_SIGNAL
);
1196 s
->signal
.sig
= sig
;
1197 s
->signal
.callback
= callback
;
1198 s
->userdata
= userdata
;
1199 s
->enabled
= SD_EVENT_ON
;
1201 e
->signal_sources
[sig
] = s
;
1203 r
= event_make_signal_data(e
, sig
, &d
);
1207 /* Use the signal name as description for the event source by default */
1208 (void) sd_event_source_set_description(s
, signal_to_string(sig
));
1217 static bool shall_use_pidfd(void) {
1218 /* Mostly relevant for debugging, i.e. this is used in test-event.c to test the event loop once with and once without pidfd */
1219 return getenv_bool_secure("SYSTEMD_PIDFD") != 0;
1222 _public_
int sd_event_add_child(
1224 sd_event_source
**ret
,
1227 sd_event_child_handler_t callback
,
1230 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1233 assert_return(e
, -EINVAL
);
1234 assert_return(e
= event_resolve(e
), -ENOPKG
);
1235 assert_return(pid
> 1, -EINVAL
);
1236 assert_return(!(options
& ~(WEXITED
|WSTOPPED
|WCONTINUED
)), -EINVAL
);
1237 assert_return(options
!= 0, -EINVAL
);
1238 assert_return(callback
, -EINVAL
);
1239 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1240 assert_return(!event_pid_changed(e
), -ECHILD
);
1242 if (e
->n_enabled_child_sources
== 0) {
1243 /* Caller must block SIGCHLD before using us to watch children, even if pidfd is available,
1244 * for compatibility with pre-pidfd and because we don't want the reap the child processes
1245 * ourselves, i.e. call waitid(), and don't want Linux' default internal logic for that to
1248 * (As an optimization we only do this check on the first child event source created.) */
1249 r
= signal_is_blocked(SIGCHLD
);
1256 r
= hashmap_ensure_allocated(&e
->child_sources
, NULL
);
1260 if (hashmap_contains(e
->child_sources
, PID_TO_PTR(pid
)))
1263 s
= source_new(e
, !ret
, SOURCE_CHILD
);
1267 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1269 s
->child
.options
= options
;
1270 s
->child
.callback
= callback
;
1271 s
->userdata
= userdata
;
1272 s
->enabled
= SD_EVENT_ONESHOT
;
1274 /* We always take a pidfd here if we can, even if we wait for anything else than WEXITED, so that we
1275 * pin the PID, and make regular waitid() handling race-free. */
1277 if (shall_use_pidfd()) {
1278 s
->child
.pidfd
= pidfd_open(s
->child
.pid
, 0);
1279 if (s
->child
.pidfd
< 0) {
1280 /* Propagate errors unless the syscall is not supported or blocked */
1281 if (!ERRNO_IS_NOT_SUPPORTED(errno
) && !ERRNO_IS_PRIVILEGE(errno
))
1284 s
->child
.pidfd_owned
= true; /* If we allocate the pidfd we own it by default */
1286 s
->child
.pidfd
= -1;
1288 r
= hashmap_put(e
->child_sources
, PID_TO_PTR(pid
), s
);
1292 e
->n_enabled_child_sources
++;
1294 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
1295 /* We have a pidfd and we only want to watch for exit */
1297 r
= source_child_pidfd_register(s
, s
->enabled
);
1299 e
->n_enabled_child_sources
--;
1303 /* We have no pidfd or we shall wait for some other event than WEXITED */
1305 r
= event_make_signal_data(e
, SIGCHLD
, NULL
);
1307 e
->n_enabled_child_sources
--;
1311 e
->need_process_child
= true;
1321 _public_
int sd_event_add_child_pidfd(
1323 sd_event_source
**ret
,
1326 sd_event_child_handler_t callback
,
1330 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1334 assert_return(e
, -EINVAL
);
1335 assert_return(e
= event_resolve(e
), -ENOPKG
);
1336 assert_return(pidfd
>= 0, -EBADF
);
1337 assert_return(!(options
& ~(WEXITED
|WSTOPPED
|WCONTINUED
)), -EINVAL
);
1338 assert_return(options
!= 0, -EINVAL
);
1339 assert_return(callback
, -EINVAL
);
1340 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1341 assert_return(!event_pid_changed(e
), -ECHILD
);
1343 if (e
->n_enabled_child_sources
== 0) {
1344 r
= signal_is_blocked(SIGCHLD
);
1351 r
= hashmap_ensure_allocated(&e
->child_sources
, NULL
);
1355 r
= pidfd_get_pid(pidfd
, &pid
);
1359 if (hashmap_contains(e
->child_sources
, PID_TO_PTR(pid
)))
1362 s
= source_new(e
, !ret
, SOURCE_CHILD
);
1366 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1367 s
->child
.pidfd
= pidfd
;
1369 s
->child
.options
= options
;
1370 s
->child
.callback
= callback
;
1371 s
->child
.pidfd_owned
= false; /* If we got the pidfd passed in we don't own it by default (similar to the IO fd case) */
1372 s
->userdata
= userdata
;
1373 s
->enabled
= SD_EVENT_ONESHOT
;
1375 r
= hashmap_put(e
->child_sources
, PID_TO_PTR(pid
), s
);
1379 e
->n_enabled_child_sources
++;
1381 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
1382 /* We only want to watch for WEXITED */
1384 r
= source_child_pidfd_register(s
, s
->enabled
);
1386 e
->n_enabled_child_sources
--;
1390 /* We shall wait for some other event than WEXITED */
1392 r
= event_make_signal_data(e
, SIGCHLD
, NULL
);
1394 e
->n_enabled_child_sources
--;
1398 e
->need_process_child
= true;
1408 _public_
int sd_event_add_defer(
1410 sd_event_source
**ret
,
1411 sd_event_handler_t callback
,
1414 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1417 assert_return(e
, -EINVAL
);
1418 assert_return(e
= event_resolve(e
), -ENOPKG
);
1419 assert_return(callback
, -EINVAL
);
1420 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1421 assert_return(!event_pid_changed(e
), -ECHILD
);
1423 s
= source_new(e
, !ret
, SOURCE_DEFER
);
1427 s
->defer
.callback
= callback
;
1428 s
->userdata
= userdata
;
1429 s
->enabled
= SD_EVENT_ONESHOT
;
1431 r
= source_set_pending(s
, true);
1442 _public_
int sd_event_add_post(
1444 sd_event_source
**ret
,
1445 sd_event_handler_t callback
,
1448 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1451 assert_return(e
, -EINVAL
);
1452 assert_return(e
= event_resolve(e
), -ENOPKG
);
1453 assert_return(callback
, -EINVAL
);
1454 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1455 assert_return(!event_pid_changed(e
), -ECHILD
);
1457 r
= set_ensure_allocated(&e
->post_sources
, NULL
);
1461 s
= source_new(e
, !ret
, SOURCE_POST
);
1465 s
->post
.callback
= callback
;
1466 s
->userdata
= userdata
;
1467 s
->enabled
= SD_EVENT_ON
;
1469 r
= set_put(e
->post_sources
, s
);
1480 _public_
int sd_event_add_exit(
1482 sd_event_source
**ret
,
1483 sd_event_handler_t callback
,
1486 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1489 assert_return(e
, -EINVAL
);
1490 assert_return(e
= event_resolve(e
), -ENOPKG
);
1491 assert_return(callback
, -EINVAL
);
1492 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1493 assert_return(!event_pid_changed(e
), -ECHILD
);
1495 r
= prioq_ensure_allocated(&e
->exit
, exit_prioq_compare
);
1499 s
= source_new(e
, !ret
, SOURCE_EXIT
);
1503 s
->exit
.callback
= callback
;
1504 s
->userdata
= userdata
;
1505 s
->exit
.prioq_index
= PRIOQ_IDX_NULL
;
1506 s
->enabled
= SD_EVENT_ONESHOT
;
1508 r
= prioq_put(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
1519 static void event_free_inotify_data(sd_event
*e
, struct inotify_data
*d
) {
1525 assert(hashmap_isempty(d
->inodes
));
1526 assert(hashmap_isempty(d
->wd
));
1528 if (d
->buffer_filled
> 0)
1529 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
1531 hashmap_free(d
->inodes
);
1532 hashmap_free(d
->wd
);
1534 assert_se(hashmap_remove(e
->inotify_data
, &d
->priority
) == d
);
1537 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, d
->fd
, NULL
) < 0)
1538 log_debug_errno(errno
, "Failed to remove inotify fd from epoll, ignoring: %m");
1545 static int event_make_inotify_data(
1548 struct inotify_data
**ret
) {
1550 _cleanup_close_
int fd
= -1;
1551 struct inotify_data
*d
;
1552 struct epoll_event ev
;
1557 d
= hashmap_get(e
->inotify_data
, &priority
);
1564 fd
= inotify_init1(IN_NONBLOCK
|O_CLOEXEC
);
1568 fd
= fd_move_above_stdio(fd
);
1570 r
= hashmap_ensure_allocated(&e
->inotify_data
, &uint64_hash_ops
);
1574 d
= new(struct inotify_data
, 1);
1578 *d
= (struct inotify_data
) {
1579 .wakeup
= WAKEUP_INOTIFY_DATA
,
1581 .priority
= priority
,
1584 r
= hashmap_put(e
->inotify_data
, &d
->priority
, d
);
1586 d
->fd
= safe_close(d
->fd
);
1591 ev
= (struct epoll_event
) {
1596 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
) < 0) {
1598 d
->fd
= safe_close(d
->fd
); /* let's close this ourselves, as event_free_inotify_data() would otherwise
1599 * remove the fd from the epoll first, which we don't want as we couldn't
1600 * add it in the first place. */
1601 event_free_inotify_data(e
, d
);
1611 static int inode_data_compare(const struct inode_data
*x
, const struct inode_data
*y
) {
1617 r
= CMP(x
->dev
, y
->dev
);
1621 return CMP(x
->ino
, y
->ino
);
1624 static void inode_data_hash_func(const struct inode_data
*d
, struct siphash
*state
) {
1627 siphash24_compress(&d
->dev
, sizeof(d
->dev
), state
);
1628 siphash24_compress(&d
->ino
, sizeof(d
->ino
), state
);
1631 DEFINE_PRIVATE_HASH_OPS(inode_data_hash_ops
, struct inode_data
, inode_data_hash_func
, inode_data_compare
);
1633 static void event_free_inode_data(
1635 struct inode_data
*d
) {
1642 assert(!d
->event_sources
);
1645 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
1649 if (d
->inotify_data
) {
1652 if (d
->inotify_data
->fd
>= 0) {
1653 /* So here's a problem. At the time this runs the watch descriptor might already be
1654 * invalidated, because an IN_IGNORED event might be queued right the moment we enter
1655 * the syscall. Hence, whenever we get EINVAL, ignore it entirely, since it's a very
1656 * likely case to happen. */
1658 if (inotify_rm_watch(d
->inotify_data
->fd
, d
->wd
) < 0 && errno
!= EINVAL
)
1659 log_debug_errno(errno
, "Failed to remove watch descriptor %i from inotify, ignoring: %m", d
->wd
);
1662 assert_se(hashmap_remove(d
->inotify_data
->wd
, INT_TO_PTR(d
->wd
)) == d
);
1665 assert_se(hashmap_remove(d
->inotify_data
->inodes
, d
) == d
);
1671 static void event_gc_inode_data(
1673 struct inode_data
*d
) {
1675 struct inotify_data
*inotify_data
;
1682 if (d
->event_sources
)
1685 inotify_data
= d
->inotify_data
;
1686 event_free_inode_data(e
, d
);
1688 if (inotify_data
&& hashmap_isempty(inotify_data
->inodes
))
1689 event_free_inotify_data(e
, inotify_data
);
1692 static int event_make_inode_data(
1694 struct inotify_data
*inotify_data
,
1697 struct inode_data
**ret
) {
1699 struct inode_data
*d
, key
;
1703 assert(inotify_data
);
1705 key
= (struct inode_data
) {
1710 d
= hashmap_get(inotify_data
->inodes
, &key
);
1718 r
= hashmap_ensure_allocated(&inotify_data
->inodes
, &inode_data_hash_ops
);
1722 d
= new(struct inode_data
, 1);
1726 *d
= (struct inode_data
) {
1731 .inotify_data
= inotify_data
,
1734 r
= hashmap_put(inotify_data
->inodes
, d
, d
);
1746 static uint32_t inode_data_determine_mask(struct inode_data
*d
) {
1747 bool excl_unlink
= true;
1748 uint32_t combined
= 0;
1753 /* Combines the watch masks of all event sources watching this inode. We generally just OR them together, but
1754 * the IN_EXCL_UNLINK flag is ANDed instead.
1756 * Note that we add all sources to the mask here, regardless whether enabled, disabled or oneshot. That's
1757 * because we cannot change the mask anymore after the event source was created once, since the kernel has no
1758 * API for that. Hence we need to subscribe to the maximum mask we ever might be interested in, and suppress
1759 * events we don't care for client-side. */
1761 LIST_FOREACH(inotify
.by_inode_data
, s
, d
->event_sources
) {
1763 if ((s
->inotify
.mask
& IN_EXCL_UNLINK
) == 0)
1764 excl_unlink
= false;
1766 combined
|= s
->inotify
.mask
;
1769 return (combined
& ~(IN_ONESHOT
|IN_DONT_FOLLOW
|IN_ONLYDIR
|IN_EXCL_UNLINK
)) | (excl_unlink
? IN_EXCL_UNLINK
: 0);
1772 static int inode_data_realize_watch(sd_event
*e
, struct inode_data
*d
) {
1773 uint32_t combined_mask
;
1779 combined_mask
= inode_data_determine_mask(d
);
1781 if (d
->wd
>= 0 && combined_mask
== d
->combined_mask
)
1784 r
= hashmap_ensure_allocated(&d
->inotify_data
->wd
, NULL
);
1788 wd
= inotify_add_watch_fd(d
->inotify_data
->fd
, d
->fd
, combined_mask
);
1793 r
= hashmap_put(d
->inotify_data
->wd
, INT_TO_PTR(wd
), d
);
1795 (void) inotify_rm_watch(d
->inotify_data
->fd
, wd
);
1801 } else if (d
->wd
!= wd
) {
1803 log_debug("Weird, the watch descriptor we already knew for this inode changed?");
1804 (void) inotify_rm_watch(d
->fd
, wd
);
1808 d
->combined_mask
= combined_mask
;
1812 _public_
int sd_event_add_inotify(
1814 sd_event_source
**ret
,
1817 sd_event_inotify_handler_t callback
,
1820 struct inotify_data
*inotify_data
= NULL
;
1821 struct inode_data
*inode_data
= NULL
;
1822 _cleanup_close_
int fd
= -1;
1823 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1827 assert_return(e
, -EINVAL
);
1828 assert_return(e
= event_resolve(e
), -ENOPKG
);
1829 assert_return(path
, -EINVAL
);
1830 assert_return(callback
, -EINVAL
);
1831 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1832 assert_return(!event_pid_changed(e
), -ECHILD
);
1834 /* Refuse IN_MASK_ADD since we coalesce watches on the same inode, and hence really don't want to merge
1835 * masks. Or in other words, this whole code exists only to manage IN_MASK_ADD type operations for you, hence
1836 * the user can't use them for us. */
1837 if (mask
& IN_MASK_ADD
)
1840 fd
= open(path
, O_PATH
|O_CLOEXEC
|
1841 (mask
& IN_ONLYDIR
? O_DIRECTORY
: 0)|
1842 (mask
& IN_DONT_FOLLOW
? O_NOFOLLOW
: 0));
1846 if (fstat(fd
, &st
) < 0)
1849 s
= source_new(e
, !ret
, SOURCE_INOTIFY
);
1853 s
->enabled
= mask
& IN_ONESHOT
? SD_EVENT_ONESHOT
: SD_EVENT_ON
;
1854 s
->inotify
.mask
= mask
;
1855 s
->inotify
.callback
= callback
;
1856 s
->userdata
= userdata
;
1858 /* Allocate an inotify object for this priority, and an inode object within it */
1859 r
= event_make_inotify_data(e
, SD_EVENT_PRIORITY_NORMAL
, &inotify_data
);
1863 r
= event_make_inode_data(e
, inotify_data
, st
.st_dev
, st
.st_ino
, &inode_data
);
1865 event_free_inotify_data(e
, inotify_data
);
1869 /* Keep the O_PATH fd around until the first iteration of the loop, so that we can still change the priority of
1870 * the event source, until then, for which we need the original inode. */
1871 if (inode_data
->fd
< 0) {
1872 inode_data
->fd
= TAKE_FD(fd
);
1873 LIST_PREPEND(to_close
, e
->inode_data_to_close
, inode_data
);
1876 /* Link our event source to the inode data object */
1877 LIST_PREPEND(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
1878 s
->inotify
.inode_data
= inode_data
;
1880 /* Actually realize the watch now */
1881 r
= inode_data_realize_watch(e
, inode_data
);
1885 (void) sd_event_source_set_description(s
, path
);
1894 static sd_event_source
* event_source_free(sd_event_source
*s
) {
1898 /* Here's a special hack: when we are called from a
1899 * dispatch handler we won't free the event source
1900 * immediately, but we will detach the fd from the
1901 * epoll. This way it is safe for the caller to unref
1902 * the event source and immediately close the fd, but
1903 * we still retain a valid event source object after
1906 if (s
->dispatching
) {
1907 if (s
->type
== SOURCE_IO
)
1908 source_io_unregister(s
);
1910 source_disconnect(s
);
1917 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event_source
, sd_event_source
, event_source_free
);
1919 _public_
int sd_event_source_set_description(sd_event_source
*s
, const char *description
) {
1920 assert_return(s
, -EINVAL
);
1921 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1923 return free_and_strdup(&s
->description
, description
);
1926 _public_
int sd_event_source_get_description(sd_event_source
*s
, const char **description
) {
1927 assert_return(s
, -EINVAL
);
1928 assert_return(description
, -EINVAL
);
1929 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1931 if (!s
->description
)
1934 *description
= s
->description
;
1938 _public_ sd_event
*sd_event_source_get_event(sd_event_source
*s
) {
1939 assert_return(s
, NULL
);
1944 _public_
int sd_event_source_get_pending(sd_event_source
*s
) {
1945 assert_return(s
, -EINVAL
);
1946 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
1947 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1948 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1953 _public_
int sd_event_source_get_io_fd(sd_event_source
*s
) {
1954 assert_return(s
, -EINVAL
);
1955 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1956 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1961 _public_
int sd_event_source_set_io_fd(sd_event_source
*s
, int fd
) {
1964 assert_return(s
, -EINVAL
);
1965 assert_return(fd
>= 0, -EBADF
);
1966 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1967 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1972 if (s
->enabled
== SD_EVENT_OFF
) {
1974 s
->io
.registered
= false;
1978 saved_fd
= s
->io
.fd
;
1979 assert(s
->io
.registered
);
1982 s
->io
.registered
= false;
1984 r
= source_io_register(s
, s
->enabled
, s
->io
.events
);
1986 s
->io
.fd
= saved_fd
;
1987 s
->io
.registered
= true;
1991 (void) epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, saved_fd
, NULL
);
1997 _public_
int sd_event_source_get_io_fd_own(sd_event_source
*s
) {
1998 assert_return(s
, -EINVAL
);
1999 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2004 _public_
int sd_event_source_set_io_fd_own(sd_event_source
*s
, int own
) {
2005 assert_return(s
, -EINVAL
);
2006 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2012 _public_
int sd_event_source_get_io_events(sd_event_source
*s
, uint32_t* events
) {
2013 assert_return(s
, -EINVAL
);
2014 assert_return(events
, -EINVAL
);
2015 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2016 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2018 *events
= s
->io
.events
;
2022 _public_
int sd_event_source_set_io_events(sd_event_source
*s
, uint32_t events
) {
2025 assert_return(s
, -EINVAL
);
2026 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2027 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
2028 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2029 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2031 /* edge-triggered updates are never skipped, so we can reset edges */
2032 if (s
->io
.events
== events
&& !(events
& EPOLLET
))
2035 r
= source_set_pending(s
, false);
2039 if (s
->enabled
!= SD_EVENT_OFF
) {
2040 r
= source_io_register(s
, s
->enabled
, events
);
2045 s
->io
.events
= events
;
2050 _public_
int sd_event_source_get_io_revents(sd_event_source
*s
, uint32_t* revents
) {
2051 assert_return(s
, -EINVAL
);
2052 assert_return(revents
, -EINVAL
);
2053 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2054 assert_return(s
->pending
, -ENODATA
);
2055 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2057 *revents
= s
->io
.revents
;
2061 _public_
int sd_event_source_get_signal(sd_event_source
*s
) {
2062 assert_return(s
, -EINVAL
);
2063 assert_return(s
->type
== SOURCE_SIGNAL
, -EDOM
);
2064 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2066 return s
->signal
.sig
;
2069 _public_
int sd_event_source_get_priority(sd_event_source
*s
, int64_t *priority
) {
2070 assert_return(s
, -EINVAL
);
2071 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2073 *priority
= s
->priority
;
2077 _public_
int sd_event_source_set_priority(sd_event_source
*s
, int64_t priority
) {
2078 bool rm_inotify
= false, rm_inode
= false;
2079 struct inotify_data
*new_inotify_data
= NULL
;
2080 struct inode_data
*new_inode_data
= NULL
;
2083 assert_return(s
, -EINVAL
);
2084 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2085 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2087 if (s
->priority
== priority
)
2090 if (s
->type
== SOURCE_INOTIFY
) {
2091 struct inode_data
*old_inode_data
;
2093 assert(s
->inotify
.inode_data
);
2094 old_inode_data
= s
->inotify
.inode_data
;
2096 /* We need the original fd to change the priority. If we don't have it we can't change the priority,
2097 * anymore. Note that we close any fds when entering the next event loop iteration, i.e. for inotify
2098 * events we allow priority changes only until the first following iteration. */
2099 if (old_inode_data
->fd
< 0)
2102 r
= event_make_inotify_data(s
->event
, priority
, &new_inotify_data
);
2107 r
= event_make_inode_data(s
->event
, new_inotify_data
, old_inode_data
->dev
, old_inode_data
->ino
, &new_inode_data
);
2112 if (new_inode_data
->fd
< 0) {
2113 /* Duplicate the fd for the new inode object if we don't have any yet */
2114 new_inode_data
->fd
= fcntl(old_inode_data
->fd
, F_DUPFD_CLOEXEC
, 3);
2115 if (new_inode_data
->fd
< 0) {
2120 LIST_PREPEND(to_close
, s
->event
->inode_data_to_close
, new_inode_data
);
2123 /* Move the event source to the new inode data structure */
2124 LIST_REMOVE(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
2125 LIST_PREPEND(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
2126 s
->inotify
.inode_data
= new_inode_data
;
2128 /* Now create the new watch */
2129 r
= inode_data_realize_watch(s
->event
, new_inode_data
);
2132 LIST_REMOVE(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
2133 LIST_PREPEND(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
2134 s
->inotify
.inode_data
= old_inode_data
;
2138 s
->priority
= priority
;
2140 event_gc_inode_data(s
->event
, old_inode_data
);
2142 } else if (s
->type
== SOURCE_SIGNAL
&& s
->enabled
!= SD_EVENT_OFF
) {
2143 struct signal_data
*old
, *d
;
2145 /* Move us from the signalfd belonging to the old
2146 * priority to the signalfd of the new priority */
2148 assert_se(old
= hashmap_get(s
->event
->signal_data
, &s
->priority
));
2150 s
->priority
= priority
;
2152 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, &d
);
2154 s
->priority
= old
->priority
;
2158 event_unmask_signal_data(s
->event
, old
, s
->signal
.sig
);
2160 s
->priority
= priority
;
2163 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
2166 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
2168 if (s
->type
== SOURCE_EXIT
)
2169 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2175 event_free_inode_data(s
->event
, new_inode_data
);
2178 event_free_inotify_data(s
->event
, new_inotify_data
);
2183 _public_
int sd_event_source_get_enabled(sd_event_source
*s
, int *m
) {
2184 assert_return(s
, -EINVAL
);
2185 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2189 return s
->enabled
!= SD_EVENT_OFF
;
2192 _public_
int sd_event_source_set_enabled(sd_event_source
*s
, int m
) {
2195 assert_return(s
, -EINVAL
);
2196 assert_return(IN_SET(m
, SD_EVENT_OFF
, SD_EVENT_ON
, SD_EVENT_ONESHOT
), -EINVAL
);
2197 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2199 /* If we are dead anyway, we are fine with turning off
2200 * sources, but everything else needs to fail. */
2201 if (s
->event
->state
== SD_EVENT_FINISHED
)
2202 return m
== SD_EVENT_OFF
? 0 : -ESTALE
;
2204 if (s
->enabled
== m
)
2207 if (m
== SD_EVENT_OFF
) {
2209 /* Unset the pending flag when this event source is disabled */
2210 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2211 r
= source_set_pending(s
, false);
2219 source_io_unregister(s
);
2223 case SOURCE_TIME_REALTIME
:
2224 case SOURCE_TIME_BOOTTIME
:
2225 case SOURCE_TIME_MONOTONIC
:
2226 case SOURCE_TIME_REALTIME_ALARM
:
2227 case SOURCE_TIME_BOOTTIME_ALARM
: {
2228 struct clock_data
*d
;
2231 d
= event_get_clock_data(s
->event
, s
->type
);
2234 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2235 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2236 d
->needs_rearm
= true;
2243 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2249 assert(s
->event
->n_enabled_child_sources
> 0);
2250 s
->event
->n_enabled_child_sources
--;
2252 if (EVENT_SOURCE_WATCH_PIDFD(s
))
2253 source_child_pidfd_unregister(s
);
2255 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2261 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2266 case SOURCE_INOTIFY
:
2271 assert_not_reached("Wut? I shouldn't exist.");
2276 /* Unset the pending flag when this event source is enabled */
2277 if (s
->enabled
== SD_EVENT_OFF
&& !IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2278 r
= source_set_pending(s
, false);
2286 r
= source_io_register(s
, m
, s
->io
.events
);
2293 case SOURCE_TIME_REALTIME
:
2294 case SOURCE_TIME_BOOTTIME
:
2295 case SOURCE_TIME_MONOTONIC
:
2296 case SOURCE_TIME_REALTIME_ALARM
:
2297 case SOURCE_TIME_BOOTTIME_ALARM
: {
2298 struct clock_data
*d
;
2301 d
= event_get_clock_data(s
->event
, s
->type
);
2304 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2305 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2306 d
->needs_rearm
= true;
2314 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, NULL
);
2316 s
->enabled
= SD_EVENT_OFF
;
2317 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2325 if (s
->enabled
== SD_EVENT_OFF
)
2326 s
->event
->n_enabled_child_sources
++;
2330 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
2331 /* yes, we have pidfd */
2333 r
= source_child_pidfd_register(s
, s
->enabled
);
2335 s
->enabled
= SD_EVENT_OFF
;
2336 s
->event
->n_enabled_child_sources
--;
2340 /* no pidfd, or something other to watch for than WEXITED */
2342 r
= event_make_signal_data(s
->event
, SIGCHLD
, NULL
);
2344 s
->enabled
= SD_EVENT_OFF
;
2345 s
->event
->n_enabled_child_sources
--;
2346 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2355 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2360 case SOURCE_INOTIFY
:
2365 assert_not_reached("Wut? I shouldn't exist.");
2370 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
2373 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
2378 _public_
int sd_event_source_get_time(sd_event_source
*s
, uint64_t *usec
) {
2379 assert_return(s
, -EINVAL
);
2380 assert_return(usec
, -EINVAL
);
2381 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2382 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2384 *usec
= s
->time
.next
;
2388 _public_
int sd_event_source_set_time(sd_event_source
*s
, uint64_t usec
) {
2389 struct clock_data
*d
;
2392 assert_return(s
, -EINVAL
);
2393 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2394 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2395 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2397 r
= source_set_pending(s
, false);
2401 s
->time
.next
= usec
;
2403 d
= event_get_clock_data(s
->event
, s
->type
);
2406 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2407 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2408 d
->needs_rearm
= true;
2413 _public_
int sd_event_source_get_time_accuracy(sd_event_source
*s
, uint64_t *usec
) {
2414 assert_return(s
, -EINVAL
);
2415 assert_return(usec
, -EINVAL
);
2416 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2417 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2419 *usec
= s
->time
.accuracy
;
2423 _public_
int sd_event_source_set_time_accuracy(sd_event_source
*s
, uint64_t usec
) {
2424 struct clock_data
*d
;
2427 assert_return(s
, -EINVAL
);
2428 assert_return(usec
!= (uint64_t) -1, -EINVAL
);
2429 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2430 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2431 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2433 r
= source_set_pending(s
, false);
2438 usec
= DEFAULT_ACCURACY_USEC
;
2440 s
->time
.accuracy
= usec
;
2442 d
= event_get_clock_data(s
->event
, s
->type
);
2445 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2446 d
->needs_rearm
= true;
2451 _public_
int sd_event_source_get_time_clock(sd_event_source
*s
, clockid_t
*clock
) {
2452 assert_return(s
, -EINVAL
);
2453 assert_return(clock
, -EINVAL
);
2454 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2455 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2457 *clock
= event_source_type_to_clock(s
->type
);
2461 _public_
int sd_event_source_get_child_pid(sd_event_source
*s
, pid_t
*pid
) {
2462 assert_return(s
, -EINVAL
);
2463 assert_return(pid
, -EINVAL
);
2464 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2465 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2467 *pid
= s
->child
.pid
;
2471 _public_
int sd_event_source_get_child_pidfd(sd_event_source
*s
) {
2472 assert_return(s
, -EINVAL
);
2473 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2474 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2476 if (s
->child
.pidfd
< 0)
2479 return s
->child
.pidfd
;
2482 _public_
int sd_event_source_send_child_signal(sd_event_source
*s
, int sig
, const siginfo_t
*si
, unsigned flags
) {
2483 assert_return(s
, -EINVAL
);
2484 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2485 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2486 assert_return(SIGNAL_VALID(sig
), -EINVAL
);
2488 /* If we already have seen indication the process exited refuse sending a signal early. This way we
2489 * can be sure we don't accidentally kill the wrong process on PID reuse when pidfds are not
2491 if (s
->child
.exited
)
2494 if (s
->child
.pidfd
>= 0) {
2497 /* pidfd_send_signal() changes the siginfo_t argument. This is weird, let's hence copy the
2502 if (pidfd_send_signal(s
->child
.pidfd
, sig
, si
? ©
: NULL
, 0) < 0) {
2503 /* Let's propagate the error only if the system call is not implemented or prohibited */
2504 if (!ERRNO_IS_NOT_SUPPORTED(errno
) && !ERRNO_IS_PRIVILEGE(errno
))
2510 /* Flags are only supported for pidfd_send_signal(), not for rt_sigqueueinfo(), hence let's refuse
2516 /* We use rt_sigqueueinfo() only if siginfo_t is specified. */
2517 siginfo_t copy
= *si
;
2519 if (rt_sigqueueinfo(s
->child
.pid
, sig
, ©
) < 0)
2521 } else if (kill(s
->child
.pid
, sig
) < 0)
2527 _public_
int sd_event_source_get_child_pidfd_own(sd_event_source
*s
) {
2528 assert_return(s
, -EINVAL
);
2529 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2531 if (s
->child
.pidfd
< 0)
2534 return s
->child
.pidfd_owned
;
2537 _public_
int sd_event_source_set_child_pidfd_own(sd_event_source
*s
, int own
) {
2538 assert_return(s
, -EINVAL
);
2539 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2541 if (s
->child
.pidfd
< 0)
2544 s
->child
.pidfd_owned
= own
;
2548 _public_
int sd_event_source_get_child_process_own(sd_event_source
*s
) {
2549 assert_return(s
, -EINVAL
);
2550 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2552 return s
->child
.process_owned
;
2555 _public_
int sd_event_source_set_child_process_own(sd_event_source
*s
, int own
) {
2556 assert_return(s
, -EINVAL
);
2557 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2559 s
->child
.process_owned
= own
;
2563 _public_
int sd_event_source_get_inotify_mask(sd_event_source
*s
, uint32_t *mask
) {
2564 assert_return(s
, -EINVAL
);
2565 assert_return(mask
, -EINVAL
);
2566 assert_return(s
->type
== SOURCE_INOTIFY
, -EDOM
);
2567 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2569 *mask
= s
->inotify
.mask
;
2573 _public_
int sd_event_source_set_prepare(sd_event_source
*s
, sd_event_handler_t callback
) {
2576 assert_return(s
, -EINVAL
);
2577 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
2578 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2579 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2581 if (s
->prepare
== callback
)
2584 if (callback
&& s
->prepare
) {
2585 s
->prepare
= callback
;
2589 r
= prioq_ensure_allocated(&s
->event
->prepare
, prepare_prioq_compare
);
2593 s
->prepare
= callback
;
2596 r
= prioq_put(s
->event
->prepare
, s
, &s
->prepare_index
);
2600 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
2605 _public_
void* sd_event_source_get_userdata(sd_event_source
*s
) {
2606 assert_return(s
, NULL
);
2611 _public_
void *sd_event_source_set_userdata(sd_event_source
*s
, void *userdata
) {
2614 assert_return(s
, NULL
);
2617 s
->userdata
= userdata
;
2622 static usec_t
sleep_between(sd_event
*e
, usec_t a
, usec_t b
) {
2629 if (a
>= USEC_INFINITY
)
2630 return USEC_INFINITY
;
2635 initialize_perturb(e
);
2638 Find a good time to wake up again between times a and b. We
2639 have two goals here:
2641 a) We want to wake up as seldom as possible, hence prefer
2642 later times over earlier times.
2644 b) But if we have to wake up, then let's make sure to
2645 dispatch as much as possible on the entire system.
2647 We implement this by waking up everywhere at the same time
2648 within any given minute if we can, synchronised via the
2649 perturbation value determined from the boot ID. If we can't,
2650 then we try to find the same spot in every 10s, then 1s and
2651 then 250ms step. Otherwise, we pick the last possible time
2655 c
= (b
/ USEC_PER_MINUTE
) * USEC_PER_MINUTE
+ e
->perturb
;
2657 if (_unlikely_(c
< USEC_PER_MINUTE
))
2660 c
-= USEC_PER_MINUTE
;
2666 c
= (b
/ (USEC_PER_SEC
*10)) * (USEC_PER_SEC
*10) + (e
->perturb
% (USEC_PER_SEC
*10));
2668 if (_unlikely_(c
< USEC_PER_SEC
*10))
2671 c
-= USEC_PER_SEC
*10;
2677 c
= (b
/ USEC_PER_SEC
) * USEC_PER_SEC
+ (e
->perturb
% USEC_PER_SEC
);
2679 if (_unlikely_(c
< USEC_PER_SEC
))
2688 c
= (b
/ (USEC_PER_MSEC
*250)) * (USEC_PER_MSEC
*250) + (e
->perturb
% (USEC_PER_MSEC
*250));
2690 if (_unlikely_(c
< USEC_PER_MSEC
*250))
2693 c
-= USEC_PER_MSEC
*250;
2702 static int event_arm_timer(
2704 struct clock_data
*d
) {
2706 struct itimerspec its
= {};
2707 sd_event_source
*a
, *b
;
2714 if (!d
->needs_rearm
)
2717 d
->needs_rearm
= false;
2719 a
= prioq_peek(d
->earliest
);
2720 if (!a
|| a
->enabled
== SD_EVENT_OFF
|| a
->time
.next
== USEC_INFINITY
) {
2725 if (d
->next
== USEC_INFINITY
)
2729 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2733 d
->next
= USEC_INFINITY
;
2737 b
= prioq_peek(d
->latest
);
2738 assert_se(b
&& b
->enabled
!= SD_EVENT_OFF
);
2740 t
= sleep_between(e
, a
->time
.next
, time_event_source_latest(b
));
2744 assert_se(d
->fd
>= 0);
2747 /* We don' want to disarm here, just mean some time looooong ago. */
2748 its
.it_value
.tv_sec
= 0;
2749 its
.it_value
.tv_nsec
= 1;
2751 timespec_store(&its
.it_value
, t
);
2753 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2761 static int process_io(sd_event
*e
, sd_event_source
*s
, uint32_t revents
) {
2764 assert(s
->type
== SOURCE_IO
);
2766 /* If the event source was already pending, we just OR in the
2767 * new revents, otherwise we reset the value. The ORing is
2768 * necessary to handle EPOLLONESHOT events properly where
2769 * readability might happen independently of writability, and
2770 * we need to keep track of both */
2773 s
->io
.revents
|= revents
;
2775 s
->io
.revents
= revents
;
2777 return source_set_pending(s
, true);
2780 static int flush_timer(sd_event
*e
, int fd
, uint32_t events
, usec_t
*next
) {
2787 assert_return(events
== EPOLLIN
, -EIO
);
2789 ss
= read(fd
, &x
, sizeof(x
));
2791 if (IN_SET(errno
, EAGAIN
, EINTR
))
2797 if (_unlikely_(ss
!= sizeof(x
)))
2801 *next
= USEC_INFINITY
;
2806 static int process_timer(
2809 struct clock_data
*d
) {
2818 s
= prioq_peek(d
->earliest
);
2821 s
->enabled
== SD_EVENT_OFF
||
2825 r
= source_set_pending(s
, true);
2829 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2830 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2831 d
->needs_rearm
= true;
2837 static int process_child(sd_event
*e
) {
2844 e
->need_process_child
= false;
2847 So, this is ugly. We iteratively invoke waitid() with P_PID
2848 + WNOHANG for each PID we wait for, instead of using
2849 P_ALL. This is because we only want to get child
2850 information of very specific child processes, and not all
2851 of them. We might not have processed the SIGCHLD even of a
2852 previous invocation and we don't want to maintain a
2853 unbounded *per-child* event queue, hence we really don't
2854 want anything flushed out of the kernel's queue that we
2855 don't care about. Since this is O(n) this means that if you
2856 have a lot of processes you probably want to handle SIGCHLD
2859 We do not reap the children here (by using WNOWAIT), this
2860 is only done after the event source is dispatched so that
2861 the callback still sees the process as a zombie.
2864 HASHMAP_FOREACH(s
, e
->child_sources
, i
) {
2865 assert(s
->type
== SOURCE_CHILD
);
2870 if (s
->enabled
== SD_EVENT_OFF
)
2873 if (s
->child
.exited
)
2876 if (EVENT_SOURCE_WATCH_PIDFD(s
)) /* There's a usable pidfd known for this event source? then don't waitid() for it here */
2879 zero(s
->child
.siginfo
);
2880 r
= waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
,
2881 WNOHANG
| (s
->child
.options
& WEXITED
? WNOWAIT
: 0) | s
->child
.options
);
2885 if (s
->child
.siginfo
.si_pid
!= 0) {
2886 bool zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
2889 s
->child
.exited
= true;
2891 if (!zombie
&& (s
->child
.options
& WEXITED
)) {
2892 /* If the child isn't dead then let's
2893 * immediately remove the state change
2894 * from the queue, since there's no
2895 * benefit in leaving it queued */
2897 assert(s
->child
.options
& (WSTOPPED
|WCONTINUED
));
2898 (void) waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|(s
->child
.options
& (WSTOPPED
|WCONTINUED
)));
2901 r
= source_set_pending(s
, true);
2910 static int process_pidfd(sd_event
*e
, sd_event_source
*s
, uint32_t revents
) {
2913 assert(s
->type
== SOURCE_CHILD
);
2918 if (s
->enabled
== SD_EVENT_OFF
)
2921 if (!EVENT_SOURCE_WATCH_PIDFD(s
))
2924 zero(s
->child
.siginfo
);
2925 if (waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
| WNOWAIT
| s
->child
.options
) < 0)
2928 if (s
->child
.siginfo
.si_pid
== 0)
2931 if (IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
))
2932 s
->child
.exited
= true;
2934 return source_set_pending(s
, true);
2937 static int process_signal(sd_event
*e
, struct signal_data
*d
, uint32_t events
) {
2938 bool read_one
= false;
2943 assert_return(events
== EPOLLIN
, -EIO
);
2945 /* If there's a signal queued on this priority and SIGCHLD is
2946 on this priority too, then make sure to recheck the
2947 children we watch. This is because we only ever dequeue
2948 the first signal per priority, and if we dequeue one, and
2949 SIGCHLD might be enqueued later we wouldn't know, but we
2950 might have higher priority children we care about hence we
2951 need to check that explicitly. */
2953 if (sigismember(&d
->sigset
, SIGCHLD
))
2954 e
->need_process_child
= true;
2956 /* If there's already an event source pending for this
2957 * priority we don't read another */
2962 struct signalfd_siginfo si
;
2964 sd_event_source
*s
= NULL
;
2966 n
= read(d
->fd
, &si
, sizeof(si
));
2968 if (IN_SET(errno
, EAGAIN
, EINTR
))
2974 if (_unlikely_(n
!= sizeof(si
)))
2977 assert(SIGNAL_VALID(si
.ssi_signo
));
2981 if (e
->signal_sources
)
2982 s
= e
->signal_sources
[si
.ssi_signo
];
2988 s
->signal
.siginfo
= si
;
2991 r
= source_set_pending(s
, true);
2999 static int event_inotify_data_read(sd_event
*e
, struct inotify_data
*d
, uint32_t revents
) {
3005 assert_return(revents
== EPOLLIN
, -EIO
);
3007 /* If there's already an event source pending for this priority, don't read another */
3008 if (d
->n_pending
> 0)
3011 /* Is the read buffer non-empty? If so, let's not read more */
3012 if (d
->buffer_filled
> 0)
3015 n
= read(d
->fd
, &d
->buffer
, sizeof(d
->buffer
));
3017 if (IN_SET(errno
, EAGAIN
, EINTR
))
3024 d
->buffer_filled
= (size_t) n
;
3025 LIST_PREPEND(buffered
, e
->inotify_data_buffered
, d
);
3030 static void event_inotify_data_drop(sd_event
*e
, struct inotify_data
*d
, size_t sz
) {
3033 assert(sz
<= d
->buffer_filled
);
3038 /* Move the rest to the buffer to the front, in order to get things properly aligned again */
3039 memmove(d
->buffer
.raw
, d
->buffer
.raw
+ sz
, d
->buffer_filled
- sz
);
3040 d
->buffer_filled
-= sz
;
3042 if (d
->buffer_filled
== 0)
3043 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
3046 static int event_inotify_data_process(sd_event
*e
, struct inotify_data
*d
) {
3052 /* If there's already an event source pending for this priority, don't read another */
3053 if (d
->n_pending
> 0)
3056 while (d
->buffer_filled
> 0) {
3059 /* Let's validate that the event structures are complete */
3060 if (d
->buffer_filled
< offsetof(struct inotify_event
, name
))
3063 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
3064 if (d
->buffer_filled
< sz
)
3067 if (d
->buffer
.ev
.mask
& IN_Q_OVERFLOW
) {
3068 struct inode_data
*inode_data
;
3071 /* The queue overran, let's pass this event to all event sources connected to this inotify
3074 HASHMAP_FOREACH(inode_data
, d
->inodes
, i
) {
3077 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
3079 if (s
->enabled
== SD_EVENT_OFF
)
3082 r
= source_set_pending(s
, true);
3088 struct inode_data
*inode_data
;
3091 /* Find the inode object for this watch descriptor. If IN_IGNORED is set we also remove it from
3092 * our watch descriptor table. */
3093 if (d
->buffer
.ev
.mask
& IN_IGNORED
) {
3095 inode_data
= hashmap_remove(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
3097 event_inotify_data_drop(e
, d
, sz
);
3101 /* The watch descriptor was removed by the kernel, let's drop it here too */
3102 inode_data
->wd
= -1;
3104 inode_data
= hashmap_get(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
3106 event_inotify_data_drop(e
, d
, sz
);
3111 /* Trigger all event sources that are interested in these events. Also trigger all event
3112 * sources if IN_IGNORED or IN_UNMOUNT is set. */
3113 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
3115 if (s
->enabled
== SD_EVENT_OFF
)
3118 if ((d
->buffer
.ev
.mask
& (IN_IGNORED
|IN_UNMOUNT
)) == 0 &&
3119 (s
->inotify
.mask
& d
->buffer
.ev
.mask
& IN_ALL_EVENTS
) == 0)
3122 r
= source_set_pending(s
, true);
3128 /* Something pending now? If so, let's finish, otherwise let's read more. */
3129 if (d
->n_pending
> 0)
3136 static int process_inotify(sd_event
*e
) {
3137 struct inotify_data
*d
;
3142 LIST_FOREACH(buffered
, d
, e
->inotify_data_buffered
) {
3143 r
= event_inotify_data_process(e
, d
);
3153 static int source_dispatch(sd_event_source
*s
) {
3154 EventSourceType saved_type
;
3158 assert(s
->pending
|| s
->type
== SOURCE_EXIT
);
3160 /* Save the event source type, here, so that we still know it after the event callback which might invalidate
3162 saved_type
= s
->type
;
3164 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
3165 r
= source_set_pending(s
, false);
3170 if (s
->type
!= SOURCE_POST
) {
3174 /* If we execute a non-post source, let's mark all
3175 * post sources as pending */
3177 SET_FOREACH(z
, s
->event
->post_sources
, i
) {
3178 if (z
->enabled
== SD_EVENT_OFF
)
3181 r
= source_set_pending(z
, true);
3187 if (s
->enabled
== SD_EVENT_ONESHOT
) {
3188 r
= sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3193 s
->dispatching
= true;
3198 r
= s
->io
.callback(s
, s
->io
.fd
, s
->io
.revents
, s
->userdata
);
3201 case SOURCE_TIME_REALTIME
:
3202 case SOURCE_TIME_BOOTTIME
:
3203 case SOURCE_TIME_MONOTONIC
:
3204 case SOURCE_TIME_REALTIME_ALARM
:
3205 case SOURCE_TIME_BOOTTIME_ALARM
:
3206 r
= s
->time
.callback(s
, s
->time
.next
, s
->userdata
);
3210 r
= s
->signal
.callback(s
, &s
->signal
.siginfo
, s
->userdata
);
3213 case SOURCE_CHILD
: {
3216 zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
3218 r
= s
->child
.callback(s
, &s
->child
.siginfo
, s
->userdata
);
3220 /* Now, reap the PID for good. */
3222 (void) waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|WEXITED
);
3223 s
->child
.waited
= true;
3230 r
= s
->defer
.callback(s
, s
->userdata
);
3234 r
= s
->post
.callback(s
, s
->userdata
);
3238 r
= s
->exit
.callback(s
, s
->userdata
);
3241 case SOURCE_INOTIFY
: {
3242 struct sd_event
*e
= s
->event
;
3243 struct inotify_data
*d
;
3246 assert(s
->inotify
.inode_data
);
3247 assert_se(d
= s
->inotify
.inode_data
->inotify_data
);
3249 assert(d
->buffer_filled
>= offsetof(struct inotify_event
, name
));
3250 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
3251 assert(d
->buffer_filled
>= sz
);
3253 r
= s
->inotify
.callback(s
, &d
->buffer
.ev
, s
->userdata
);
3255 /* When no event is pending anymore on this inotify object, then let's drop the event from the
3257 if (d
->n_pending
== 0)
3258 event_inotify_data_drop(e
, d
, sz
);
3263 case SOURCE_WATCHDOG
:
3264 case _SOURCE_EVENT_SOURCE_TYPE_MAX
:
3265 case _SOURCE_EVENT_SOURCE_TYPE_INVALID
:
3266 assert_not_reached("Wut? I shouldn't exist.");
3269 s
->dispatching
= false;
3272 log_debug_errno(r
, "Event source %s (type %s) returned error, disabling: %m",
3273 strna(s
->description
), event_source_type_to_string(saved_type
));
3278 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3283 static int event_prepare(sd_event
*e
) {
3291 s
= prioq_peek(e
->prepare
);
3292 if (!s
|| s
->prepare_iteration
== e
->iteration
|| s
->enabled
== SD_EVENT_OFF
)
3295 s
->prepare_iteration
= e
->iteration
;
3296 r
= prioq_reshuffle(e
->prepare
, s
, &s
->prepare_index
);
3302 s
->dispatching
= true;
3303 r
= s
->prepare(s
, s
->userdata
);
3304 s
->dispatching
= false;
3307 log_debug_errno(r
, "Prepare callback of event source %s (type %s) returned error, disabling: %m",
3308 strna(s
->description
), event_source_type_to_string(s
->type
));
3313 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3319 static int dispatch_exit(sd_event
*e
) {
3321 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3326 p
= prioq_peek(e
->exit
);
3327 if (!p
|| p
->enabled
== SD_EVENT_OFF
) {
3328 e
->state
= SD_EVENT_FINISHED
;
3332 ref
= sd_event_ref(e
);
3334 e
->state
= SD_EVENT_EXITING
;
3335 r
= source_dispatch(p
);
3336 e
->state
= SD_EVENT_INITIAL
;
3340 static sd_event_source
* event_next_pending(sd_event
*e
) {
3345 p
= prioq_peek(e
->pending
);
3349 if (p
->enabled
== SD_EVENT_OFF
)
3355 static int arm_watchdog(sd_event
*e
) {
3356 struct itimerspec its
= {};
3361 assert(e
->watchdog_fd
>= 0);
3363 t
= sleep_between(e
,
3364 e
->watchdog_last
+ (e
->watchdog_period
/ 2),
3365 e
->watchdog_last
+ (e
->watchdog_period
* 3 / 4));
3367 timespec_store(&its
.it_value
, t
);
3369 /* Make sure we never set the watchdog to 0, which tells the
3370 * kernel to disable it. */
3371 if (its
.it_value
.tv_sec
== 0 && its
.it_value
.tv_nsec
== 0)
3372 its
.it_value
.tv_nsec
= 1;
3374 r
= timerfd_settime(e
->watchdog_fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
3381 static int process_watchdog(sd_event
*e
) {
3387 /* Don't notify watchdog too often */
3388 if (e
->watchdog_last
+ e
->watchdog_period
/ 4 > e
->timestamp
.monotonic
)
3391 sd_notify(false, "WATCHDOG=1");
3392 e
->watchdog_last
= e
->timestamp
.monotonic
;
3394 return arm_watchdog(e
);
3397 static void event_close_inode_data_fds(sd_event
*e
) {
3398 struct inode_data
*d
;
3402 /* Close the fds pointing to the inodes to watch now. We need to close them as they might otherwise pin
3403 * filesystems. But we can't close them right-away as we need them as long as the user still wants to make
3404 * adjustments to the even source, such as changing the priority (which requires us to remove and re-add a watch
3405 * for the inode). Hence, let's close them when entering the first iteration after they were added, as a
3408 while ((d
= e
->inode_data_to_close
)) {
3410 d
->fd
= safe_close(d
->fd
);
3412 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
3416 _public_
int sd_event_prepare(sd_event
*e
) {
3419 assert_return(e
, -EINVAL
);
3420 assert_return(e
= event_resolve(e
), -ENOPKG
);
3421 assert_return(!event_pid_changed(e
), -ECHILD
);
3422 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3423 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3425 /* Let's check that if we are a default event loop we are executed in the correct thread. We only do
3426 * this check here once, since gettid() is typically not cached, and thus want to minimize
3428 assert_return(!e
->default_event_ptr
|| e
->tid
== gettid(), -EREMOTEIO
);
3430 if (e
->exit_requested
)
3435 e
->state
= SD_EVENT_PREPARING
;
3436 r
= event_prepare(e
);
3437 e
->state
= SD_EVENT_INITIAL
;
3441 r
= event_arm_timer(e
, &e
->realtime
);
3445 r
= event_arm_timer(e
, &e
->boottime
);
3449 r
= event_arm_timer(e
, &e
->monotonic
);
3453 r
= event_arm_timer(e
, &e
->realtime_alarm
);
3457 r
= event_arm_timer(e
, &e
->boottime_alarm
);
3461 event_close_inode_data_fds(e
);
3463 if (event_next_pending(e
) || e
->need_process_child
)
3466 e
->state
= SD_EVENT_ARMED
;
3471 e
->state
= SD_EVENT_ARMED
;
3472 r
= sd_event_wait(e
, 0);
3474 e
->state
= SD_EVENT_ARMED
;
3479 _public_
int sd_event_wait(sd_event
*e
, uint64_t timeout
) {
3480 struct epoll_event
*ev_queue
;
3481 unsigned ev_queue_max
;
3484 assert_return(e
, -EINVAL
);
3485 assert_return(e
= event_resolve(e
), -ENOPKG
);
3486 assert_return(!event_pid_changed(e
), -ECHILD
);
3487 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3488 assert_return(e
->state
== SD_EVENT_ARMED
, -EBUSY
);
3490 if (e
->exit_requested
) {
3491 e
->state
= SD_EVENT_PENDING
;
3495 ev_queue_max
= MAX(e
->n_sources
, 1u);
3496 ev_queue
= newa(struct epoll_event
, ev_queue_max
);
3498 /* If we still have inotify data buffered, then query the other fds, but don't wait on it */
3499 if (e
->inotify_data_buffered
)
3502 m
= epoll_wait(e
->epoll_fd
, ev_queue
, ev_queue_max
,
3503 timeout
== (uint64_t) -1 ? -1 : (int) DIV_ROUND_UP(timeout
, USEC_PER_MSEC
));
3505 if (errno
== EINTR
) {
3506 e
->state
= SD_EVENT_PENDING
;
3514 triple_timestamp_get(&e
->timestamp
);
3516 for (i
= 0; i
< m
; i
++) {
3518 if (ev_queue
[i
].data
.ptr
== INT_TO_PTR(SOURCE_WATCHDOG
))
3519 r
= flush_timer(e
, e
->watchdog_fd
, ev_queue
[i
].events
, NULL
);
3521 WakeupType
*t
= ev_queue
[i
].data
.ptr
;
3525 case WAKEUP_EVENT_SOURCE
: {
3526 sd_event_source
*s
= ev_queue
[i
].data
.ptr
;
3533 r
= process_io(e
, s
, ev_queue
[i
].events
);
3537 r
= process_pidfd(e
, s
, ev_queue
[i
].events
);
3541 assert_not_reached("Unexpected event source type");
3547 case WAKEUP_CLOCK_DATA
: {
3548 struct clock_data
*d
= ev_queue
[i
].data
.ptr
;
3552 r
= flush_timer(e
, d
->fd
, ev_queue
[i
].events
, &d
->next
);
3556 case WAKEUP_SIGNAL_DATA
:
3557 r
= process_signal(e
, ev_queue
[i
].data
.ptr
, ev_queue
[i
].events
);
3560 case WAKEUP_INOTIFY_DATA
:
3561 r
= event_inotify_data_read(e
, ev_queue
[i
].data
.ptr
, ev_queue
[i
].events
);
3565 assert_not_reached("Invalid wake-up pointer");
3572 r
= process_watchdog(e
);
3576 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime
);
3580 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime
);
3584 r
= process_timer(e
, e
->timestamp
.monotonic
, &e
->monotonic
);
3588 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime_alarm
);
3592 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime_alarm
);
3596 if (e
->need_process_child
) {
3597 r
= process_child(e
);
3602 r
= process_inotify(e
);
3606 if (event_next_pending(e
)) {
3607 e
->state
= SD_EVENT_PENDING
;
3615 e
->state
= SD_EVENT_INITIAL
;
3620 _public_
int sd_event_dispatch(sd_event
*e
) {
3624 assert_return(e
, -EINVAL
);
3625 assert_return(e
= event_resolve(e
), -ENOPKG
);
3626 assert_return(!event_pid_changed(e
), -ECHILD
);
3627 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3628 assert_return(e
->state
== SD_EVENT_PENDING
, -EBUSY
);
3630 if (e
->exit_requested
)
3631 return dispatch_exit(e
);
3633 p
= event_next_pending(e
);
3635 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3637 ref
= sd_event_ref(e
);
3638 e
->state
= SD_EVENT_RUNNING
;
3639 r
= source_dispatch(p
);
3640 e
->state
= SD_EVENT_INITIAL
;
3644 e
->state
= SD_EVENT_INITIAL
;
3649 static void event_log_delays(sd_event
*e
) {
3650 char b
[ELEMENTSOF(e
->delays
) * DECIMAL_STR_MAX(unsigned) + 1], *p
;
3655 for (i
= 0; i
< ELEMENTSOF(e
->delays
); i
++) {
3656 l
= strpcpyf(&p
, l
, "%u ", e
->delays
[i
]);
3659 log_debug("Event loop iterations: %s", b
);
3662 _public_
int sd_event_run(sd_event
*e
, uint64_t timeout
) {
3665 assert_return(e
, -EINVAL
);
3666 assert_return(e
= event_resolve(e
), -ENOPKG
);
3667 assert_return(!event_pid_changed(e
), -ECHILD
);
3668 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3669 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3671 if (e
->profile_delays
&& e
->last_run
) {
3675 this_run
= now(CLOCK_MONOTONIC
);
3677 l
= u64log2(this_run
- e
->last_run
);
3678 assert(l
< sizeof(e
->delays
));
3681 if (this_run
- e
->last_log
>= 5*USEC_PER_SEC
) {
3682 event_log_delays(e
);
3683 e
->last_log
= this_run
;
3687 r
= sd_event_prepare(e
);
3689 /* There was nothing? Then wait... */
3690 r
= sd_event_wait(e
, timeout
);
3692 if (e
->profile_delays
)
3693 e
->last_run
= now(CLOCK_MONOTONIC
);
3696 /* There's something now, then let's dispatch it */
3697 r
= sd_event_dispatch(e
);
3707 _public_
int sd_event_loop(sd_event
*e
) {
3708 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3711 assert_return(e
, -EINVAL
);
3712 assert_return(e
= event_resolve(e
), -ENOPKG
);
3713 assert_return(!event_pid_changed(e
), -ECHILD
);
3714 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3716 ref
= sd_event_ref(e
);
3718 while (e
->state
!= SD_EVENT_FINISHED
) {
3719 r
= sd_event_run(e
, (uint64_t) -1);
3724 return e
->exit_code
;
3727 _public_
int sd_event_get_fd(sd_event
*e
) {
3729 assert_return(e
, -EINVAL
);
3730 assert_return(e
= event_resolve(e
), -ENOPKG
);
3731 assert_return(!event_pid_changed(e
), -ECHILD
);
3736 _public_
int sd_event_get_state(sd_event
*e
) {
3737 assert_return(e
, -EINVAL
);
3738 assert_return(e
= event_resolve(e
), -ENOPKG
);
3739 assert_return(!event_pid_changed(e
), -ECHILD
);
3744 _public_
int sd_event_get_exit_code(sd_event
*e
, int *code
) {
3745 assert_return(e
, -EINVAL
);
3746 assert_return(e
= event_resolve(e
), -ENOPKG
);
3747 assert_return(code
, -EINVAL
);
3748 assert_return(!event_pid_changed(e
), -ECHILD
);
3750 if (!e
->exit_requested
)
3753 *code
= e
->exit_code
;
3757 _public_
int sd_event_exit(sd_event
*e
, int code
) {
3758 assert_return(e
, -EINVAL
);
3759 assert_return(e
= event_resolve(e
), -ENOPKG
);
3760 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3761 assert_return(!event_pid_changed(e
), -ECHILD
);
3763 e
->exit_requested
= true;
3764 e
->exit_code
= code
;
3769 _public_
int sd_event_now(sd_event
*e
, clockid_t clock
, uint64_t *usec
) {
3770 assert_return(e
, -EINVAL
);
3771 assert_return(e
= event_resolve(e
), -ENOPKG
);
3772 assert_return(usec
, -EINVAL
);
3773 assert_return(!event_pid_changed(e
), -ECHILD
);
3775 if (!TRIPLE_TIMESTAMP_HAS_CLOCK(clock
))
3778 /* Generate a clean error in case CLOCK_BOOTTIME is not available. Note that don't use clock_supported() here,
3779 * for a reason: there are systems where CLOCK_BOOTTIME is supported, but CLOCK_BOOTTIME_ALARM is not, but for
3780 * the purpose of getting the time this doesn't matter. */
3781 if (IN_SET(clock
, CLOCK_BOOTTIME
, CLOCK_BOOTTIME_ALARM
) && !clock_boottime_supported())
3784 if (!triple_timestamp_is_set(&e
->timestamp
)) {
3785 /* Implicitly fall back to now() if we never ran
3786 * before and thus have no cached time. */
3791 *usec
= triple_timestamp_by_clock(&e
->timestamp
, clock
);
3795 _public_
int sd_event_default(sd_event
**ret
) {
3800 return !!default_event
;
3802 if (default_event
) {
3803 *ret
= sd_event_ref(default_event
);
3807 r
= sd_event_new(&e
);
3811 e
->default_event_ptr
= &default_event
;
3819 _public_
int sd_event_get_tid(sd_event
*e
, pid_t
*tid
) {
3820 assert_return(e
, -EINVAL
);
3821 assert_return(e
= event_resolve(e
), -ENOPKG
);
3822 assert_return(tid
, -EINVAL
);
3823 assert_return(!event_pid_changed(e
), -ECHILD
);
3833 _public_
int sd_event_set_watchdog(sd_event
*e
, int b
) {
3836 assert_return(e
, -EINVAL
);
3837 assert_return(e
= event_resolve(e
), -ENOPKG
);
3838 assert_return(!event_pid_changed(e
), -ECHILD
);
3840 if (e
->watchdog
== !!b
)
3844 struct epoll_event ev
;
3846 r
= sd_watchdog_enabled(false, &e
->watchdog_period
);
3850 /* Issue first ping immediately */
3851 sd_notify(false, "WATCHDOG=1");
3852 e
->watchdog_last
= now(CLOCK_MONOTONIC
);
3854 e
->watchdog_fd
= timerfd_create(CLOCK_MONOTONIC
, TFD_NONBLOCK
|TFD_CLOEXEC
);
3855 if (e
->watchdog_fd
< 0)
3858 r
= arm_watchdog(e
);
3862 ev
= (struct epoll_event
) {
3864 .data
.ptr
= INT_TO_PTR(SOURCE_WATCHDOG
),
3867 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, e
->watchdog_fd
, &ev
);
3874 if (e
->watchdog_fd
>= 0) {
3875 (void) epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, e
->watchdog_fd
, NULL
);
3876 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3884 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3888 _public_
int sd_event_get_watchdog(sd_event
*e
) {
3889 assert_return(e
, -EINVAL
);
3890 assert_return(e
= event_resolve(e
), -ENOPKG
);
3891 assert_return(!event_pid_changed(e
), -ECHILD
);
3896 _public_
int sd_event_get_iteration(sd_event
*e
, uint64_t *ret
) {
3897 assert_return(e
, -EINVAL
);
3898 assert_return(e
= event_resolve(e
), -ENOPKG
);
3899 assert_return(!event_pid_changed(e
), -ECHILD
);
3901 *ret
= e
->iteration
;
3905 _public_
int sd_event_source_set_destroy_callback(sd_event_source
*s
, sd_event_destroy_t callback
) {
3906 assert_return(s
, -EINVAL
);
3908 s
->destroy_callback
= callback
;
3912 _public_
int sd_event_source_get_destroy_callback(sd_event_source
*s
, sd_event_destroy_t
*ret
) {
3913 assert_return(s
, -EINVAL
);
3916 *ret
= s
->destroy_callback
;
3918 return !!s
->destroy_callback
;
3921 _public_
int sd_event_source_get_floating(sd_event_source
*s
) {
3922 assert_return(s
, -EINVAL
);
3927 _public_
int sd_event_source_set_floating(sd_event_source
*s
, int b
) {
3928 assert_return(s
, -EINVAL
);
3930 if (s
->floating
== !!b
)
3933 if (!s
->event
) /* Already disconnected */
3939 sd_event_source_ref(s
);
3940 sd_event_unref(s
->event
);
3942 sd_event_ref(s
->event
);
3943 sd_event_source_unref(s
);