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 struct epoll_event
*event_queue
;
119 size_t event_queue_allocated
;
121 LIST_HEAD(sd_event_source
, sources
);
123 usec_t last_run
, last_log
;
124 unsigned delays
[sizeof(usec_t
) * 8];
127 static thread_local sd_event
*default_event
= NULL
;
129 static void source_disconnect(sd_event_source
*s
);
130 static void event_gc_inode_data(sd_event
*e
, struct inode_data
*d
);
132 static sd_event
*event_resolve(sd_event
*e
) {
133 return e
== SD_EVENT_DEFAULT
? default_event
: e
;
136 static int pending_prioq_compare(const void *a
, const void *b
) {
137 const sd_event_source
*x
= a
, *y
= b
;
143 /* Enabled ones first */
144 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
146 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
149 /* Lower priority values first */
150 r
= CMP(x
->priority
, y
->priority
);
154 /* Older entries first */
155 return CMP(x
->pending_iteration
, y
->pending_iteration
);
158 static int prepare_prioq_compare(const void *a
, const void *b
) {
159 const sd_event_source
*x
= a
, *y
= b
;
165 /* Enabled ones first */
166 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
168 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
171 /* Move most recently prepared ones last, so that we can stop
172 * preparing as soon as we hit one that has already been
173 * prepared in the current iteration */
174 r
= CMP(x
->prepare_iteration
, y
->prepare_iteration
);
178 /* Lower priority values first */
179 return CMP(x
->priority
, y
->priority
);
182 static int earliest_time_prioq_compare(const void *a
, const void *b
) {
183 const sd_event_source
*x
= a
, *y
= b
;
185 assert(EVENT_SOURCE_IS_TIME(x
->type
));
186 assert(x
->type
== y
->type
);
188 /* Enabled ones first */
189 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
191 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
194 /* Move the pending ones to the end */
195 if (!x
->pending
&& y
->pending
)
197 if (x
->pending
&& !y
->pending
)
201 return CMP(x
->time
.next
, y
->time
.next
);
204 static usec_t
time_event_source_latest(const sd_event_source
*s
) {
205 return usec_add(s
->time
.next
, s
->time
.accuracy
);
208 static int latest_time_prioq_compare(const void *a
, const void *b
) {
209 const sd_event_source
*x
= a
, *y
= b
;
211 assert(EVENT_SOURCE_IS_TIME(x
->type
));
212 assert(x
->type
== y
->type
);
214 /* Enabled ones first */
215 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
217 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
220 /* Move the pending ones to the end */
221 if (!x
->pending
&& y
->pending
)
223 if (x
->pending
&& !y
->pending
)
227 return CMP(time_event_source_latest(x
), time_event_source_latest(y
));
230 static int exit_prioq_compare(const void *a
, const void *b
) {
231 const sd_event_source
*x
= a
, *y
= b
;
233 assert(x
->type
== SOURCE_EXIT
);
234 assert(y
->type
== SOURCE_EXIT
);
236 /* Enabled ones first */
237 if (x
->enabled
!= SD_EVENT_OFF
&& y
->enabled
== SD_EVENT_OFF
)
239 if (x
->enabled
== SD_EVENT_OFF
&& y
->enabled
!= SD_EVENT_OFF
)
242 /* Lower priority values first */
243 return CMP(x
->priority
, y
->priority
);
246 static void free_clock_data(struct clock_data
*d
) {
248 assert(d
->wakeup
== WAKEUP_CLOCK_DATA
);
251 prioq_free(d
->earliest
);
252 prioq_free(d
->latest
);
255 static sd_event
*event_free(sd_event
*e
) {
260 while ((s
= e
->sources
)) {
262 source_disconnect(s
);
263 sd_event_source_unref(s
);
266 assert(e
->n_sources
== 0);
268 if (e
->default_event_ptr
)
269 *(e
->default_event_ptr
) = NULL
;
271 safe_close(e
->epoll_fd
);
272 safe_close(e
->watchdog_fd
);
274 free_clock_data(&e
->realtime
);
275 free_clock_data(&e
->boottime
);
276 free_clock_data(&e
->monotonic
);
277 free_clock_data(&e
->realtime_alarm
);
278 free_clock_data(&e
->boottime_alarm
);
280 prioq_free(e
->pending
);
281 prioq_free(e
->prepare
);
284 free(e
->signal_sources
);
285 hashmap_free(e
->signal_data
);
287 hashmap_free(e
->inotify_data
);
289 hashmap_free(e
->child_sources
);
290 set_free(e
->post_sources
);
292 free(e
->event_queue
);
297 _public_
int sd_event_new(sd_event
** ret
) {
301 assert_return(ret
, -EINVAL
);
303 e
= new(sd_event
, 1);
311 .realtime
.wakeup
= WAKEUP_CLOCK_DATA
,
313 .realtime
.next
= USEC_INFINITY
,
314 .boottime
.wakeup
= WAKEUP_CLOCK_DATA
,
316 .boottime
.next
= USEC_INFINITY
,
317 .monotonic
.wakeup
= WAKEUP_CLOCK_DATA
,
319 .monotonic
.next
= USEC_INFINITY
,
320 .realtime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
321 .realtime_alarm
.fd
= -1,
322 .realtime_alarm
.next
= USEC_INFINITY
,
323 .boottime_alarm
.wakeup
= WAKEUP_CLOCK_DATA
,
324 .boottime_alarm
.fd
= -1,
325 .boottime_alarm
.next
= USEC_INFINITY
,
326 .perturb
= USEC_INFINITY
,
327 .original_pid
= getpid_cached(),
330 r
= prioq_ensure_allocated(&e
->pending
, pending_prioq_compare
);
334 e
->epoll_fd
= epoll_create1(EPOLL_CLOEXEC
);
335 if (e
->epoll_fd
< 0) {
340 e
->epoll_fd
= fd_move_above_stdio(e
->epoll_fd
);
342 if (secure_getenv("SD_EVENT_PROFILE_DELAYS")) {
343 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.");
344 e
->profile_delays
= true;
355 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event
, sd_event
, event_free
);
357 _public_ sd_event_source
* sd_event_source_disable_unref(sd_event_source
*s
) {
359 (void) sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
360 return sd_event_source_unref(s
);
363 static bool event_pid_changed(sd_event
*e
) {
366 /* We don't support people creating an event loop and keeping
367 * it around over a fork(). Let's complain. */
369 return e
->original_pid
!= getpid_cached();
372 static void source_io_unregister(sd_event_source
*s
) {
374 assert(s
->type
== SOURCE_IO
);
376 if (event_pid_changed(s
->event
))
379 if (!s
->io
.registered
)
382 if (epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, s
->io
.fd
, NULL
) < 0)
383 log_debug_errno(errno
, "Failed to remove source %s (type %s) from epoll: %m",
384 strna(s
->description
), event_source_type_to_string(s
->type
));
386 s
->io
.registered
= false;
389 static int source_io_register(
394 struct epoll_event ev
;
398 assert(s
->type
== SOURCE_IO
);
399 assert(enabled
!= SD_EVENT_OFF
);
401 ev
= (struct epoll_event
) {
402 .events
= events
| (enabled
== SD_EVENT_ONESHOT
? EPOLLONESHOT
: 0),
406 if (s
->io
.registered
)
407 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_MOD
, s
->io
.fd
, &ev
);
409 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_ADD
, s
->io
.fd
, &ev
);
413 s
->io
.registered
= true;
418 static void source_child_pidfd_unregister(sd_event_source
*s
) {
420 assert(s
->type
== SOURCE_CHILD
);
422 if (event_pid_changed(s
->event
))
425 if (!s
->child
.registered
)
428 if (EVENT_SOURCE_WATCH_PIDFD(s
))
429 if (epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, s
->child
.pidfd
, NULL
) < 0)
430 log_debug_errno(errno
, "Failed to remove source %s (type %s) from epoll: %m",
431 strna(s
->description
), event_source_type_to_string(s
->type
));
433 s
->child
.registered
= false;
436 static int source_child_pidfd_register(sd_event_source
*s
, int enabled
) {
440 assert(s
->type
== SOURCE_CHILD
);
441 assert(enabled
!= SD_EVENT_OFF
);
443 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
444 struct epoll_event ev
;
446 ev
= (struct epoll_event
) {
447 .events
= EPOLLIN
| (enabled
== SD_EVENT_ONESHOT
? EPOLLONESHOT
: 0),
451 if (s
->child
.registered
)
452 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_MOD
, s
->child
.pidfd
, &ev
);
454 r
= epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_ADD
, s
->child
.pidfd
, &ev
);
459 s
->child
.registered
= true;
463 static clockid_t
event_source_type_to_clock(EventSourceType t
) {
467 case SOURCE_TIME_REALTIME
:
468 return CLOCK_REALTIME
;
470 case SOURCE_TIME_BOOTTIME
:
471 return CLOCK_BOOTTIME
;
473 case SOURCE_TIME_MONOTONIC
:
474 return CLOCK_MONOTONIC
;
476 case SOURCE_TIME_REALTIME_ALARM
:
477 return CLOCK_REALTIME_ALARM
;
479 case SOURCE_TIME_BOOTTIME_ALARM
:
480 return CLOCK_BOOTTIME_ALARM
;
483 return (clockid_t
) -1;
487 static EventSourceType
clock_to_event_source_type(clockid_t clock
) {
492 return SOURCE_TIME_REALTIME
;
495 return SOURCE_TIME_BOOTTIME
;
497 case CLOCK_MONOTONIC
:
498 return SOURCE_TIME_MONOTONIC
;
500 case CLOCK_REALTIME_ALARM
:
501 return SOURCE_TIME_REALTIME_ALARM
;
503 case CLOCK_BOOTTIME_ALARM
:
504 return SOURCE_TIME_BOOTTIME_ALARM
;
507 return _SOURCE_EVENT_SOURCE_TYPE_INVALID
;
511 static struct clock_data
* event_get_clock_data(sd_event
*e
, EventSourceType t
) {
516 case SOURCE_TIME_REALTIME
:
519 case SOURCE_TIME_BOOTTIME
:
522 case SOURCE_TIME_MONOTONIC
:
523 return &e
->monotonic
;
525 case SOURCE_TIME_REALTIME_ALARM
:
526 return &e
->realtime_alarm
;
528 case SOURCE_TIME_BOOTTIME_ALARM
:
529 return &e
->boottime_alarm
;
536 static void event_free_signal_data(sd_event
*e
, struct signal_data
*d
) {
542 hashmap_remove(e
->signal_data
, &d
->priority
);
547 static int event_make_signal_data(
550 struct signal_data
**ret
) {
552 struct epoll_event ev
;
553 struct signal_data
*d
;
561 if (event_pid_changed(e
))
564 if (e
->signal_sources
&& e
->signal_sources
[sig
])
565 priority
= e
->signal_sources
[sig
]->priority
;
567 priority
= SD_EVENT_PRIORITY_NORMAL
;
569 d
= hashmap_get(e
->signal_data
, &priority
);
571 if (sigismember(&d
->sigset
, sig
) > 0) {
577 r
= hashmap_ensure_allocated(&e
->signal_data
, &uint64_hash_ops
);
581 d
= new(struct signal_data
, 1);
585 *d
= (struct signal_data
) {
586 .wakeup
= WAKEUP_SIGNAL_DATA
,
588 .priority
= priority
,
591 r
= hashmap_put(e
->signal_data
, &d
->priority
, d
);
601 assert_se(sigaddset(&ss_copy
, sig
) >= 0);
603 r
= signalfd(d
->fd
, &ss_copy
, SFD_NONBLOCK
|SFD_CLOEXEC
);
617 d
->fd
= fd_move_above_stdio(r
);
619 ev
= (struct epoll_event
) {
624 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
);
637 event_free_signal_data(e
, d
);
642 static void event_unmask_signal_data(sd_event
*e
, struct signal_data
*d
, int sig
) {
646 /* Turns off the specified signal in the signal data
647 * object. If the signal mask of the object becomes empty that
650 if (sigismember(&d
->sigset
, sig
) == 0)
653 assert_se(sigdelset(&d
->sigset
, sig
) >= 0);
655 if (sigisemptyset(&d
->sigset
)) {
656 /* If all the mask is all-zero we can get rid of the structure */
657 event_free_signal_data(e
, d
);
663 if (signalfd(d
->fd
, &d
->sigset
, SFD_NONBLOCK
|SFD_CLOEXEC
) < 0)
664 log_debug_errno(errno
, "Failed to unset signal bit, ignoring: %m");
667 static void event_gc_signal_data(sd_event
*e
, const int64_t *priority
, int sig
) {
668 struct signal_data
*d
;
669 static const int64_t zero_priority
= 0;
673 /* Rechecks if the specified signal is still something we are interested in. If not, we'll unmask it,
674 * and possibly drop the signalfd for it. */
676 if (sig
== SIGCHLD
&&
677 e
->n_enabled_child_sources
> 0)
680 if (e
->signal_sources
&&
681 e
->signal_sources
[sig
] &&
682 e
->signal_sources
[sig
]->enabled
!= SD_EVENT_OFF
)
686 * The specified signal might be enabled in three different queues:
688 * 1) the one that belongs to the priority passed (if it is non-NULL)
689 * 2) the one that belongs to the priority of the event source of the signal (if there is one)
690 * 3) the 0 priority (to cover the SIGCHLD case)
692 * Hence, let's remove it from all three here.
696 d
= hashmap_get(e
->signal_data
, priority
);
698 event_unmask_signal_data(e
, d
, sig
);
701 if (e
->signal_sources
&& e
->signal_sources
[sig
]) {
702 d
= hashmap_get(e
->signal_data
, &e
->signal_sources
[sig
]->priority
);
704 event_unmask_signal_data(e
, d
, sig
);
707 d
= hashmap_get(e
->signal_data
, &zero_priority
);
709 event_unmask_signal_data(e
, d
, sig
);
712 static void source_disconnect(sd_event_source
*s
) {
720 assert(s
->event
->n_sources
> 0);
726 source_io_unregister(s
);
730 case SOURCE_TIME_REALTIME
:
731 case SOURCE_TIME_BOOTTIME
:
732 case SOURCE_TIME_MONOTONIC
:
733 case SOURCE_TIME_REALTIME_ALARM
:
734 case SOURCE_TIME_BOOTTIME_ALARM
: {
735 struct clock_data
*d
;
737 d
= event_get_clock_data(s
->event
, s
->type
);
740 prioq_remove(d
->earliest
, s
, &s
->time
.earliest_index
);
741 prioq_remove(d
->latest
, s
, &s
->time
.latest_index
);
742 d
->needs_rearm
= true;
747 if (s
->signal
.sig
> 0) {
749 if (s
->event
->signal_sources
)
750 s
->event
->signal_sources
[s
->signal
.sig
] = NULL
;
752 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
758 if (s
->child
.pid
> 0) {
759 if (s
->enabled
!= SD_EVENT_OFF
) {
760 assert(s
->event
->n_enabled_child_sources
> 0);
761 s
->event
->n_enabled_child_sources
--;
764 (void) hashmap_remove(s
->event
->child_sources
, PID_TO_PTR(s
->child
.pid
));
767 if (EVENT_SOURCE_WATCH_PIDFD(s
))
768 source_child_pidfd_unregister(s
);
770 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
779 set_remove(s
->event
->post_sources
, s
);
783 prioq_remove(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
786 case SOURCE_INOTIFY
: {
787 struct inode_data
*inode_data
;
789 inode_data
= s
->inotify
.inode_data
;
791 struct inotify_data
*inotify_data
;
792 assert_se(inotify_data
= inode_data
->inotify_data
);
794 /* Detach this event source from the inode object */
795 LIST_REMOVE(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
796 s
->inotify
.inode_data
= NULL
;
799 assert(inotify_data
->n_pending
> 0);
800 inotify_data
->n_pending
--;
803 /* Note that we don't reduce the inotify mask for the watch descriptor here if the inode is
804 * continued to being watched. That's because inotify doesn't really have an API for that: we
805 * can only change watch masks with access to the original inode either by fd or by path. But
806 * paths aren't stable, and keeping an O_PATH fd open all the time would mean wasting an fd
807 * continuously and keeping the mount busy which we can't really do. We could reconstruct the
808 * original inode from /proc/self/fdinfo/$INOTIFY_FD (as all watch descriptors are listed
809 * there), but given the need for open_by_handle_at() which is privileged and not universally
810 * available this would be quite an incomplete solution. Hence we go the other way, leave the
811 * mask set, even if it is not minimized now, and ignore all events we aren't interested in
812 * anymore after reception. Yes, this sucks, but … Linux … */
814 /* Maybe release the inode data (and its inotify) */
815 event_gc_inode_data(s
->event
, inode_data
);
822 assert_not_reached("Wut? I shouldn't exist.");
826 prioq_remove(s
->event
->pending
, s
, &s
->pending_index
);
829 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
834 LIST_REMOVE(sources
, event
->sources
, s
);
837 /* Note that we don't invalidate the type here, since we still need it in order to close the fd or
838 * pidfd associated with this event source, which we'll do only on source_free(). */
841 sd_event_unref(event
);
844 static void source_free(sd_event_source
*s
) {
847 source_disconnect(s
);
849 if (s
->type
== SOURCE_IO
&& s
->io
.owned
)
850 s
->io
.fd
= safe_close(s
->io
.fd
);
852 if (s
->type
== SOURCE_CHILD
) {
853 /* Eventually the kernel will do this automatically for us, but for now let's emulate this (unreliably) in userspace. */
855 if (s
->child
.process_owned
) {
857 if (!s
->child
.exited
) {
860 if (s
->child
.pidfd
>= 0) {
861 if (pidfd_send_signal(s
->child
.pidfd
, SIGKILL
, NULL
, 0) < 0) {
862 if (errno
== ESRCH
) /* Already dead */
864 else if (!ERRNO_IS_NOT_SUPPORTED(errno
))
865 log_debug_errno(errno
, "Failed to kill process " PID_FMT
" via pidfd_send_signal(), re-trying via kill(): %m",
872 if (kill(s
->child
.pid
, SIGKILL
) < 0)
873 if (errno
!= ESRCH
) /* Already dead */
874 log_debug_errno(errno
, "Failed to kill process " PID_FMT
" via kill(), ignoring: %m",
878 if (!s
->child
.waited
) {
881 /* Reap the child if we can */
882 (void) waitid(P_PID
, s
->child
.pid
, &si
, WEXITED
);
886 if (s
->child
.pidfd_owned
)
887 s
->child
.pidfd
= safe_close(s
->child
.pidfd
);
890 if (s
->destroy_callback
)
891 s
->destroy_callback(s
->userdata
);
893 free(s
->description
);
896 DEFINE_TRIVIAL_CLEANUP_FUNC(sd_event_source
*, source_free
);
898 static int source_set_pending(sd_event_source
*s
, bool b
) {
902 assert(s
->type
!= SOURCE_EXIT
);
910 s
->pending_iteration
= s
->event
->iteration
;
912 r
= prioq_put(s
->event
->pending
, s
, &s
->pending_index
);
918 assert_se(prioq_remove(s
->event
->pending
, s
, &s
->pending_index
));
920 if (EVENT_SOURCE_IS_TIME(s
->type
)) {
921 struct clock_data
*d
;
923 d
= event_get_clock_data(s
->event
, s
->type
);
926 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
927 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
928 d
->needs_rearm
= true;
931 if (s
->type
== SOURCE_SIGNAL
&& !b
) {
932 struct signal_data
*d
;
934 d
= hashmap_get(s
->event
->signal_data
, &s
->priority
);
935 if (d
&& d
->current
== s
)
939 if (s
->type
== SOURCE_INOTIFY
) {
941 assert(s
->inotify
.inode_data
);
942 assert(s
->inotify
.inode_data
->inotify_data
);
945 s
->inotify
.inode_data
->inotify_data
->n_pending
++;
947 assert(s
->inotify
.inode_data
->inotify_data
->n_pending
> 0);
948 s
->inotify
.inode_data
->inotify_data
->n_pending
--;
955 static sd_event_source
*source_new(sd_event
*e
, bool floating
, EventSourceType type
) {
960 s
= new(sd_event_source
, 1);
964 *s
= (struct sd_event_source
) {
967 .floating
= floating
,
969 .pending_index
= PRIOQ_IDX_NULL
,
970 .prepare_index
= PRIOQ_IDX_NULL
,
976 LIST_PREPEND(sources
, e
->sources
, s
);
982 _public_
int sd_event_add_io(
984 sd_event_source
**ret
,
987 sd_event_io_handler_t callback
,
990 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
993 assert_return(e
, -EINVAL
);
994 assert_return(e
= event_resolve(e
), -ENOPKG
);
995 assert_return(fd
>= 0, -EBADF
);
996 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
997 assert_return(callback
, -EINVAL
);
998 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
999 assert_return(!event_pid_changed(e
), -ECHILD
);
1001 s
= source_new(e
, !ret
, SOURCE_IO
);
1005 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1007 s
->io
.events
= events
;
1008 s
->io
.callback
= callback
;
1009 s
->userdata
= userdata
;
1010 s
->enabled
= SD_EVENT_ON
;
1012 r
= source_io_register(s
, s
->enabled
, events
);
1023 static void initialize_perturb(sd_event
*e
) {
1024 sd_id128_t bootid
= {};
1026 /* When we sleep for longer, we try to realign the wakeup to
1027 the same time within each minute/second/250ms, so that
1028 events all across the system can be coalesced into a single
1029 CPU wakeup. However, let's take some system-specific
1030 randomness for this value, so that in a network of systems
1031 with synced clocks timer events are distributed a
1032 bit. Here, we calculate a perturbation usec offset from the
1035 if (_likely_(e
->perturb
!= USEC_INFINITY
))
1038 if (sd_id128_get_boot(&bootid
) >= 0)
1039 e
->perturb
= (bootid
.qwords
[0] ^ bootid
.qwords
[1]) % USEC_PER_MINUTE
;
1042 static int event_setup_timer_fd(
1044 struct clock_data
*d
,
1047 struct epoll_event ev
;
1053 if (_likely_(d
->fd
>= 0))
1056 fd
= timerfd_create(clock
, TFD_NONBLOCK
|TFD_CLOEXEC
);
1060 fd
= fd_move_above_stdio(fd
);
1062 ev
= (struct epoll_event
) {
1067 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, fd
, &ev
);
1077 static int time_exit_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
1080 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
1083 _public_
int sd_event_add_time(
1085 sd_event_source
**ret
,
1089 sd_event_time_handler_t callback
,
1092 EventSourceType type
;
1093 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1094 struct clock_data
*d
;
1097 assert_return(e
, -EINVAL
);
1098 assert_return(e
= event_resolve(e
), -ENOPKG
);
1099 assert_return(accuracy
!= (uint64_t) -1, -EINVAL
);
1100 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1101 assert_return(!event_pid_changed(e
), -ECHILD
);
1103 if (!clock_supported(clock
)) /* Checks whether the kernel supports the clock */
1106 type
= clock_to_event_source_type(clock
); /* checks whether sd-event supports this clock */
1111 callback
= time_exit_callback
;
1113 d
= event_get_clock_data(e
, type
);
1116 r
= prioq_ensure_allocated(&d
->earliest
, earliest_time_prioq_compare
);
1120 r
= prioq_ensure_allocated(&d
->latest
, latest_time_prioq_compare
);
1125 r
= event_setup_timer_fd(e
, d
, clock
);
1130 s
= source_new(e
, !ret
, type
);
1134 s
->time
.next
= usec
;
1135 s
->time
.accuracy
= accuracy
== 0 ? DEFAULT_ACCURACY_USEC
: accuracy
;
1136 s
->time
.callback
= callback
;
1137 s
->time
.earliest_index
= s
->time
.latest_index
= PRIOQ_IDX_NULL
;
1138 s
->userdata
= userdata
;
1139 s
->enabled
= SD_EVENT_ONESHOT
;
1141 d
->needs_rearm
= true;
1143 r
= prioq_put(d
->earliest
, s
, &s
->time
.earliest_index
);
1147 r
= prioq_put(d
->latest
, s
, &s
->time
.latest_index
);
1158 static int signal_exit_callback(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
1161 return sd_event_exit(sd_event_source_get_event(s
), PTR_TO_INT(userdata
));
1164 _public_
int sd_event_add_signal(
1166 sd_event_source
**ret
,
1168 sd_event_signal_handler_t callback
,
1171 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1172 struct signal_data
*d
;
1175 assert_return(e
, -EINVAL
);
1176 assert_return(e
= event_resolve(e
), -ENOPKG
);
1177 assert_return(SIGNAL_VALID(sig
), -EINVAL
);
1178 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1179 assert_return(!event_pid_changed(e
), -ECHILD
);
1182 callback
= signal_exit_callback
;
1184 r
= signal_is_blocked(sig
);
1190 if (!e
->signal_sources
) {
1191 e
->signal_sources
= new0(sd_event_source
*, _NSIG
);
1192 if (!e
->signal_sources
)
1194 } else if (e
->signal_sources
[sig
])
1197 s
= source_new(e
, !ret
, SOURCE_SIGNAL
);
1201 s
->signal
.sig
= sig
;
1202 s
->signal
.callback
= callback
;
1203 s
->userdata
= userdata
;
1204 s
->enabled
= SD_EVENT_ON
;
1206 e
->signal_sources
[sig
] = s
;
1208 r
= event_make_signal_data(e
, sig
, &d
);
1212 /* Use the signal name as description for the event source by default */
1213 (void) sd_event_source_set_description(s
, signal_to_string(sig
));
1222 static bool shall_use_pidfd(void) {
1223 /* Mostly relevant for debugging, i.e. this is used in test-event.c to test the event loop once with and once without pidfd */
1224 return getenv_bool_secure("SYSTEMD_PIDFD") != 0;
1227 _public_
int sd_event_add_child(
1229 sd_event_source
**ret
,
1232 sd_event_child_handler_t callback
,
1235 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1238 assert_return(e
, -EINVAL
);
1239 assert_return(e
= event_resolve(e
), -ENOPKG
);
1240 assert_return(pid
> 1, -EINVAL
);
1241 assert_return(!(options
& ~(WEXITED
|WSTOPPED
|WCONTINUED
)), -EINVAL
);
1242 assert_return(options
!= 0, -EINVAL
);
1243 assert_return(callback
, -EINVAL
);
1244 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1245 assert_return(!event_pid_changed(e
), -ECHILD
);
1247 if (e
->n_enabled_child_sources
== 0) {
1248 /* Caller must block SIGCHLD before using us to watch children, even if pidfd is available,
1249 * for compatibility with pre-pidfd and because we don't want the reap the child processes
1250 * ourselves, i.e. call waitid(), and don't want Linux' default internal logic for that to
1253 * (As an optimization we only do this check on the first child event source created.) */
1254 r
= signal_is_blocked(SIGCHLD
);
1261 r
= hashmap_ensure_allocated(&e
->child_sources
, NULL
);
1265 if (hashmap_contains(e
->child_sources
, PID_TO_PTR(pid
)))
1268 s
= source_new(e
, !ret
, SOURCE_CHILD
);
1272 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1274 s
->child
.options
= options
;
1275 s
->child
.callback
= callback
;
1276 s
->userdata
= userdata
;
1277 s
->enabled
= SD_EVENT_ONESHOT
;
1279 /* We always take a pidfd here if we can, even if we wait for anything else than WEXITED, so that we
1280 * pin the PID, and make regular waitid() handling race-free. */
1282 if (shall_use_pidfd()) {
1283 s
->child
.pidfd
= pidfd_open(s
->child
.pid
, 0);
1284 if (s
->child
.pidfd
< 0) {
1285 /* Propagate errors unless the syscall is not supported or blocked */
1286 if (!ERRNO_IS_NOT_SUPPORTED(errno
) && !ERRNO_IS_PRIVILEGE(errno
))
1289 s
->child
.pidfd_owned
= true; /* If we allocate the pidfd we own it by default */
1291 s
->child
.pidfd
= -1;
1293 r
= hashmap_put(e
->child_sources
, PID_TO_PTR(pid
), s
);
1297 e
->n_enabled_child_sources
++;
1299 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
1300 /* We have a pidfd and we only want to watch for exit */
1302 r
= source_child_pidfd_register(s
, s
->enabled
);
1304 e
->n_enabled_child_sources
--;
1308 /* We have no pidfd or we shall wait for some other event than WEXITED */
1310 r
= event_make_signal_data(e
, SIGCHLD
, NULL
);
1312 e
->n_enabled_child_sources
--;
1316 e
->need_process_child
= true;
1326 _public_
int sd_event_add_child_pidfd(
1328 sd_event_source
**ret
,
1331 sd_event_child_handler_t callback
,
1335 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1339 assert_return(e
, -EINVAL
);
1340 assert_return(e
= event_resolve(e
), -ENOPKG
);
1341 assert_return(pidfd
>= 0, -EBADF
);
1342 assert_return(!(options
& ~(WEXITED
|WSTOPPED
|WCONTINUED
)), -EINVAL
);
1343 assert_return(options
!= 0, -EINVAL
);
1344 assert_return(callback
, -EINVAL
);
1345 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1346 assert_return(!event_pid_changed(e
), -ECHILD
);
1348 if (e
->n_enabled_child_sources
== 0) {
1349 r
= signal_is_blocked(SIGCHLD
);
1356 r
= hashmap_ensure_allocated(&e
->child_sources
, NULL
);
1360 r
= pidfd_get_pid(pidfd
, &pid
);
1364 if (hashmap_contains(e
->child_sources
, PID_TO_PTR(pid
)))
1367 s
= source_new(e
, !ret
, SOURCE_CHILD
);
1371 s
->wakeup
= WAKEUP_EVENT_SOURCE
;
1372 s
->child
.pidfd
= pidfd
;
1374 s
->child
.options
= options
;
1375 s
->child
.callback
= callback
;
1376 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) */
1377 s
->userdata
= userdata
;
1378 s
->enabled
= SD_EVENT_ONESHOT
;
1380 r
= hashmap_put(e
->child_sources
, PID_TO_PTR(pid
), s
);
1384 e
->n_enabled_child_sources
++;
1386 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
1387 /* We only want to watch for WEXITED */
1389 r
= source_child_pidfd_register(s
, s
->enabled
);
1391 e
->n_enabled_child_sources
--;
1395 /* We shall wait for some other event than WEXITED */
1397 r
= event_make_signal_data(e
, SIGCHLD
, NULL
);
1399 e
->n_enabled_child_sources
--;
1403 e
->need_process_child
= true;
1413 _public_
int sd_event_add_defer(
1415 sd_event_source
**ret
,
1416 sd_event_handler_t callback
,
1419 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1422 assert_return(e
, -EINVAL
);
1423 assert_return(e
= event_resolve(e
), -ENOPKG
);
1424 assert_return(callback
, -EINVAL
);
1425 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1426 assert_return(!event_pid_changed(e
), -ECHILD
);
1428 s
= source_new(e
, !ret
, SOURCE_DEFER
);
1432 s
->defer
.callback
= callback
;
1433 s
->userdata
= userdata
;
1434 s
->enabled
= SD_EVENT_ONESHOT
;
1436 r
= source_set_pending(s
, true);
1447 _public_
int sd_event_add_post(
1449 sd_event_source
**ret
,
1450 sd_event_handler_t callback
,
1453 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1456 assert_return(e
, -EINVAL
);
1457 assert_return(e
= event_resolve(e
), -ENOPKG
);
1458 assert_return(callback
, -EINVAL
);
1459 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1460 assert_return(!event_pid_changed(e
), -ECHILD
);
1462 r
= set_ensure_allocated(&e
->post_sources
, NULL
);
1466 s
= source_new(e
, !ret
, SOURCE_POST
);
1470 s
->post
.callback
= callback
;
1471 s
->userdata
= userdata
;
1472 s
->enabled
= SD_EVENT_ON
;
1474 r
= set_put(e
->post_sources
, s
);
1485 _public_
int sd_event_add_exit(
1487 sd_event_source
**ret
,
1488 sd_event_handler_t callback
,
1491 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1494 assert_return(e
, -EINVAL
);
1495 assert_return(e
= event_resolve(e
), -ENOPKG
);
1496 assert_return(callback
, -EINVAL
);
1497 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1498 assert_return(!event_pid_changed(e
), -ECHILD
);
1500 r
= prioq_ensure_allocated(&e
->exit
, exit_prioq_compare
);
1504 s
= source_new(e
, !ret
, SOURCE_EXIT
);
1508 s
->exit
.callback
= callback
;
1509 s
->userdata
= userdata
;
1510 s
->exit
.prioq_index
= PRIOQ_IDX_NULL
;
1511 s
->enabled
= SD_EVENT_ONESHOT
;
1513 r
= prioq_put(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
1524 static void event_free_inotify_data(sd_event
*e
, struct inotify_data
*d
) {
1530 assert(hashmap_isempty(d
->inodes
));
1531 assert(hashmap_isempty(d
->wd
));
1533 if (d
->buffer_filled
> 0)
1534 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
1536 hashmap_free(d
->inodes
);
1537 hashmap_free(d
->wd
);
1539 assert_se(hashmap_remove(e
->inotify_data
, &d
->priority
) == d
);
1542 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, d
->fd
, NULL
) < 0)
1543 log_debug_errno(errno
, "Failed to remove inotify fd from epoll, ignoring: %m");
1550 static int event_make_inotify_data(
1553 struct inotify_data
**ret
) {
1555 _cleanup_close_
int fd
= -1;
1556 struct inotify_data
*d
;
1557 struct epoll_event ev
;
1562 d
= hashmap_get(e
->inotify_data
, &priority
);
1569 fd
= inotify_init1(IN_NONBLOCK
|O_CLOEXEC
);
1573 fd
= fd_move_above_stdio(fd
);
1575 r
= hashmap_ensure_allocated(&e
->inotify_data
, &uint64_hash_ops
);
1579 d
= new(struct inotify_data
, 1);
1583 *d
= (struct inotify_data
) {
1584 .wakeup
= WAKEUP_INOTIFY_DATA
,
1586 .priority
= priority
,
1589 r
= hashmap_put(e
->inotify_data
, &d
->priority
, d
);
1591 d
->fd
= safe_close(d
->fd
);
1596 ev
= (struct epoll_event
) {
1601 if (epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, d
->fd
, &ev
) < 0) {
1603 d
->fd
= safe_close(d
->fd
); /* let's close this ourselves, as event_free_inotify_data() would otherwise
1604 * remove the fd from the epoll first, which we don't want as we couldn't
1605 * add it in the first place. */
1606 event_free_inotify_data(e
, d
);
1616 static int inode_data_compare(const struct inode_data
*x
, const struct inode_data
*y
) {
1622 r
= CMP(x
->dev
, y
->dev
);
1626 return CMP(x
->ino
, y
->ino
);
1629 static void inode_data_hash_func(const struct inode_data
*d
, struct siphash
*state
) {
1632 siphash24_compress(&d
->dev
, sizeof(d
->dev
), state
);
1633 siphash24_compress(&d
->ino
, sizeof(d
->ino
), state
);
1636 DEFINE_PRIVATE_HASH_OPS(inode_data_hash_ops
, struct inode_data
, inode_data_hash_func
, inode_data_compare
);
1638 static void event_free_inode_data(
1640 struct inode_data
*d
) {
1647 assert(!d
->event_sources
);
1650 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
1654 if (d
->inotify_data
) {
1657 if (d
->inotify_data
->fd
>= 0) {
1658 /* So here's a problem. At the time this runs the watch descriptor might already be
1659 * invalidated, because an IN_IGNORED event might be queued right the moment we enter
1660 * the syscall. Hence, whenever we get EINVAL, ignore it entirely, since it's a very
1661 * likely case to happen. */
1663 if (inotify_rm_watch(d
->inotify_data
->fd
, d
->wd
) < 0 && errno
!= EINVAL
)
1664 log_debug_errno(errno
, "Failed to remove watch descriptor %i from inotify, ignoring: %m", d
->wd
);
1667 assert_se(hashmap_remove(d
->inotify_data
->wd
, INT_TO_PTR(d
->wd
)) == d
);
1670 assert_se(hashmap_remove(d
->inotify_data
->inodes
, d
) == d
);
1676 static void event_gc_inode_data(
1678 struct inode_data
*d
) {
1680 struct inotify_data
*inotify_data
;
1687 if (d
->event_sources
)
1690 inotify_data
= d
->inotify_data
;
1691 event_free_inode_data(e
, d
);
1693 if (inotify_data
&& hashmap_isempty(inotify_data
->inodes
))
1694 event_free_inotify_data(e
, inotify_data
);
1697 static int event_make_inode_data(
1699 struct inotify_data
*inotify_data
,
1702 struct inode_data
**ret
) {
1704 struct inode_data
*d
, key
;
1708 assert(inotify_data
);
1710 key
= (struct inode_data
) {
1715 d
= hashmap_get(inotify_data
->inodes
, &key
);
1723 r
= hashmap_ensure_allocated(&inotify_data
->inodes
, &inode_data_hash_ops
);
1727 d
= new(struct inode_data
, 1);
1731 *d
= (struct inode_data
) {
1736 .inotify_data
= inotify_data
,
1739 r
= hashmap_put(inotify_data
->inodes
, d
, d
);
1751 static uint32_t inode_data_determine_mask(struct inode_data
*d
) {
1752 bool excl_unlink
= true;
1753 uint32_t combined
= 0;
1758 /* Combines the watch masks of all event sources watching this inode. We generally just OR them together, but
1759 * the IN_EXCL_UNLINK flag is ANDed instead.
1761 * Note that we add all sources to the mask here, regardless whether enabled, disabled or oneshot. That's
1762 * because we cannot change the mask anymore after the event source was created once, since the kernel has no
1763 * API for that. Hence we need to subscribe to the maximum mask we ever might be interested in, and suppress
1764 * events we don't care for client-side. */
1766 LIST_FOREACH(inotify
.by_inode_data
, s
, d
->event_sources
) {
1768 if ((s
->inotify
.mask
& IN_EXCL_UNLINK
) == 0)
1769 excl_unlink
= false;
1771 combined
|= s
->inotify
.mask
;
1774 return (combined
& ~(IN_ONESHOT
|IN_DONT_FOLLOW
|IN_ONLYDIR
|IN_EXCL_UNLINK
)) | (excl_unlink
? IN_EXCL_UNLINK
: 0);
1777 static int inode_data_realize_watch(sd_event
*e
, struct inode_data
*d
) {
1778 uint32_t combined_mask
;
1784 combined_mask
= inode_data_determine_mask(d
);
1786 if (d
->wd
>= 0 && combined_mask
== d
->combined_mask
)
1789 r
= hashmap_ensure_allocated(&d
->inotify_data
->wd
, NULL
);
1793 wd
= inotify_add_watch_fd(d
->inotify_data
->fd
, d
->fd
, combined_mask
);
1798 r
= hashmap_put(d
->inotify_data
->wd
, INT_TO_PTR(wd
), d
);
1800 (void) inotify_rm_watch(d
->inotify_data
->fd
, wd
);
1806 } else if (d
->wd
!= wd
) {
1808 log_debug("Weird, the watch descriptor we already knew for this inode changed?");
1809 (void) inotify_rm_watch(d
->fd
, wd
);
1813 d
->combined_mask
= combined_mask
;
1817 _public_
int sd_event_add_inotify(
1819 sd_event_source
**ret
,
1822 sd_event_inotify_handler_t callback
,
1825 struct inotify_data
*inotify_data
= NULL
;
1826 struct inode_data
*inode_data
= NULL
;
1827 _cleanup_close_
int fd
= -1;
1828 _cleanup_(source_freep
) sd_event_source
*s
= NULL
;
1832 assert_return(e
, -EINVAL
);
1833 assert_return(e
= event_resolve(e
), -ENOPKG
);
1834 assert_return(path
, -EINVAL
);
1835 assert_return(callback
, -EINVAL
);
1836 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1837 assert_return(!event_pid_changed(e
), -ECHILD
);
1839 /* Refuse IN_MASK_ADD since we coalesce watches on the same inode, and hence really don't want to merge
1840 * masks. Or in other words, this whole code exists only to manage IN_MASK_ADD type operations for you, hence
1841 * the user can't use them for us. */
1842 if (mask
& IN_MASK_ADD
)
1845 fd
= open(path
, O_PATH
|O_CLOEXEC
|
1846 (mask
& IN_ONLYDIR
? O_DIRECTORY
: 0)|
1847 (mask
& IN_DONT_FOLLOW
? O_NOFOLLOW
: 0));
1851 if (fstat(fd
, &st
) < 0)
1854 s
= source_new(e
, !ret
, SOURCE_INOTIFY
);
1858 s
->enabled
= mask
& IN_ONESHOT
? SD_EVENT_ONESHOT
: SD_EVENT_ON
;
1859 s
->inotify
.mask
= mask
;
1860 s
->inotify
.callback
= callback
;
1861 s
->userdata
= userdata
;
1863 /* Allocate an inotify object for this priority, and an inode object within it */
1864 r
= event_make_inotify_data(e
, SD_EVENT_PRIORITY_NORMAL
, &inotify_data
);
1868 r
= event_make_inode_data(e
, inotify_data
, st
.st_dev
, st
.st_ino
, &inode_data
);
1870 event_free_inotify_data(e
, inotify_data
);
1874 /* Keep the O_PATH fd around until the first iteration of the loop, so that we can still change the priority of
1875 * the event source, until then, for which we need the original inode. */
1876 if (inode_data
->fd
< 0) {
1877 inode_data
->fd
= TAKE_FD(fd
);
1878 LIST_PREPEND(to_close
, e
->inode_data_to_close
, inode_data
);
1881 /* Link our event source to the inode data object */
1882 LIST_PREPEND(inotify
.by_inode_data
, inode_data
->event_sources
, s
);
1883 s
->inotify
.inode_data
= inode_data
;
1885 /* Actually realize the watch now */
1886 r
= inode_data_realize_watch(e
, inode_data
);
1890 (void) sd_event_source_set_description(s
, path
);
1899 static sd_event_source
* event_source_free(sd_event_source
*s
) {
1903 /* Here's a special hack: when we are called from a
1904 * dispatch handler we won't free the event source
1905 * immediately, but we will detach the fd from the
1906 * epoll. This way it is safe for the caller to unref
1907 * the event source and immediately close the fd, but
1908 * we still retain a valid event source object after
1911 if (s
->dispatching
) {
1912 if (s
->type
== SOURCE_IO
)
1913 source_io_unregister(s
);
1915 source_disconnect(s
);
1922 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event_source
, sd_event_source
, event_source_free
);
1924 _public_
int sd_event_source_set_description(sd_event_source
*s
, const char *description
) {
1925 assert_return(s
, -EINVAL
);
1926 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1928 return free_and_strdup(&s
->description
, description
);
1931 _public_
int sd_event_source_get_description(sd_event_source
*s
, const char **description
) {
1932 assert_return(s
, -EINVAL
);
1933 assert_return(description
, -EINVAL
);
1934 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1936 if (!s
->description
)
1939 *description
= s
->description
;
1943 _public_ sd_event
*sd_event_source_get_event(sd_event_source
*s
) {
1944 assert_return(s
, NULL
);
1949 _public_
int sd_event_source_get_pending(sd_event_source
*s
) {
1950 assert_return(s
, -EINVAL
);
1951 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
1952 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
1953 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1958 _public_
int sd_event_source_get_io_fd(sd_event_source
*s
) {
1959 assert_return(s
, -EINVAL
);
1960 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1961 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1966 _public_
int sd_event_source_set_io_fd(sd_event_source
*s
, int fd
) {
1969 assert_return(s
, -EINVAL
);
1970 assert_return(fd
>= 0, -EBADF
);
1971 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
1972 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
1977 if (s
->enabled
== SD_EVENT_OFF
) {
1979 s
->io
.registered
= false;
1983 saved_fd
= s
->io
.fd
;
1984 assert(s
->io
.registered
);
1987 s
->io
.registered
= false;
1989 r
= source_io_register(s
, s
->enabled
, s
->io
.events
);
1991 s
->io
.fd
= saved_fd
;
1992 s
->io
.registered
= true;
1996 (void) epoll_ctl(s
->event
->epoll_fd
, EPOLL_CTL_DEL
, saved_fd
, NULL
);
2002 _public_
int sd_event_source_get_io_fd_own(sd_event_source
*s
) {
2003 assert_return(s
, -EINVAL
);
2004 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2009 _public_
int sd_event_source_set_io_fd_own(sd_event_source
*s
, int own
) {
2010 assert_return(s
, -EINVAL
);
2011 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2017 _public_
int sd_event_source_get_io_events(sd_event_source
*s
, uint32_t* events
) {
2018 assert_return(s
, -EINVAL
);
2019 assert_return(events
, -EINVAL
);
2020 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2021 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2023 *events
= s
->io
.events
;
2027 _public_
int sd_event_source_set_io_events(sd_event_source
*s
, uint32_t events
) {
2030 assert_return(s
, -EINVAL
);
2031 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2032 assert_return(!(events
& ~(EPOLLIN
|EPOLLOUT
|EPOLLRDHUP
|EPOLLPRI
|EPOLLERR
|EPOLLHUP
|EPOLLET
)), -EINVAL
);
2033 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2034 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2036 /* edge-triggered updates are never skipped, so we can reset edges */
2037 if (s
->io
.events
== events
&& !(events
& EPOLLET
))
2040 r
= source_set_pending(s
, false);
2044 if (s
->enabled
!= SD_EVENT_OFF
) {
2045 r
= source_io_register(s
, s
->enabled
, events
);
2050 s
->io
.events
= events
;
2055 _public_
int sd_event_source_get_io_revents(sd_event_source
*s
, uint32_t* revents
) {
2056 assert_return(s
, -EINVAL
);
2057 assert_return(revents
, -EINVAL
);
2058 assert_return(s
->type
== SOURCE_IO
, -EDOM
);
2059 assert_return(s
->pending
, -ENODATA
);
2060 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2062 *revents
= s
->io
.revents
;
2066 _public_
int sd_event_source_get_signal(sd_event_source
*s
) {
2067 assert_return(s
, -EINVAL
);
2068 assert_return(s
->type
== SOURCE_SIGNAL
, -EDOM
);
2069 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2071 return s
->signal
.sig
;
2074 _public_
int sd_event_source_get_priority(sd_event_source
*s
, int64_t *priority
) {
2075 assert_return(s
, -EINVAL
);
2076 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2078 *priority
= s
->priority
;
2082 _public_
int sd_event_source_set_priority(sd_event_source
*s
, int64_t priority
) {
2083 bool rm_inotify
= false, rm_inode
= false;
2084 struct inotify_data
*new_inotify_data
= NULL
;
2085 struct inode_data
*new_inode_data
= NULL
;
2088 assert_return(s
, -EINVAL
);
2089 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2090 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2092 if (s
->priority
== priority
)
2095 if (s
->type
== SOURCE_INOTIFY
) {
2096 struct inode_data
*old_inode_data
;
2098 assert(s
->inotify
.inode_data
);
2099 old_inode_data
= s
->inotify
.inode_data
;
2101 /* We need the original fd to change the priority. If we don't have it we can't change the priority,
2102 * anymore. Note that we close any fds when entering the next event loop iteration, i.e. for inotify
2103 * events we allow priority changes only until the first following iteration. */
2104 if (old_inode_data
->fd
< 0)
2107 r
= event_make_inotify_data(s
->event
, priority
, &new_inotify_data
);
2112 r
= event_make_inode_data(s
->event
, new_inotify_data
, old_inode_data
->dev
, old_inode_data
->ino
, &new_inode_data
);
2117 if (new_inode_data
->fd
< 0) {
2118 /* Duplicate the fd for the new inode object if we don't have any yet */
2119 new_inode_data
->fd
= fcntl(old_inode_data
->fd
, F_DUPFD_CLOEXEC
, 3);
2120 if (new_inode_data
->fd
< 0) {
2125 LIST_PREPEND(to_close
, s
->event
->inode_data_to_close
, new_inode_data
);
2128 /* Move the event source to the new inode data structure */
2129 LIST_REMOVE(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
2130 LIST_PREPEND(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
2131 s
->inotify
.inode_data
= new_inode_data
;
2133 /* Now create the new watch */
2134 r
= inode_data_realize_watch(s
->event
, new_inode_data
);
2137 LIST_REMOVE(inotify
.by_inode_data
, new_inode_data
->event_sources
, s
);
2138 LIST_PREPEND(inotify
.by_inode_data
, old_inode_data
->event_sources
, s
);
2139 s
->inotify
.inode_data
= old_inode_data
;
2143 s
->priority
= priority
;
2145 event_gc_inode_data(s
->event
, old_inode_data
);
2147 } else if (s
->type
== SOURCE_SIGNAL
&& s
->enabled
!= SD_EVENT_OFF
) {
2148 struct signal_data
*old
, *d
;
2150 /* Move us from the signalfd belonging to the old
2151 * priority to the signalfd of the new priority */
2153 assert_se(old
= hashmap_get(s
->event
->signal_data
, &s
->priority
));
2155 s
->priority
= priority
;
2157 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, &d
);
2159 s
->priority
= old
->priority
;
2163 event_unmask_signal_data(s
->event
, old
, s
->signal
.sig
);
2165 s
->priority
= priority
;
2168 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
2171 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
2173 if (s
->type
== SOURCE_EXIT
)
2174 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2180 event_free_inode_data(s
->event
, new_inode_data
);
2183 event_free_inotify_data(s
->event
, new_inotify_data
);
2188 _public_
int sd_event_source_get_enabled(sd_event_source
*s
, int *m
) {
2189 assert_return(s
, -EINVAL
);
2190 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2194 return s
->enabled
!= SD_EVENT_OFF
;
2197 _public_
int sd_event_source_set_enabled(sd_event_source
*s
, int m
) {
2200 assert_return(s
, -EINVAL
);
2201 assert_return(IN_SET(m
, SD_EVENT_OFF
, SD_EVENT_ON
, SD_EVENT_ONESHOT
), -EINVAL
);
2202 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2204 /* If we are dead anyway, we are fine with turning off
2205 * sources, but everything else needs to fail. */
2206 if (s
->event
->state
== SD_EVENT_FINISHED
)
2207 return m
== SD_EVENT_OFF
? 0 : -ESTALE
;
2209 if (s
->enabled
== m
)
2212 if (m
== SD_EVENT_OFF
) {
2214 /* Unset the pending flag when this event source is disabled */
2215 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2216 r
= source_set_pending(s
, false);
2224 source_io_unregister(s
);
2228 case SOURCE_TIME_REALTIME
:
2229 case SOURCE_TIME_BOOTTIME
:
2230 case SOURCE_TIME_MONOTONIC
:
2231 case SOURCE_TIME_REALTIME_ALARM
:
2232 case SOURCE_TIME_BOOTTIME_ALARM
: {
2233 struct clock_data
*d
;
2236 d
= event_get_clock_data(s
->event
, s
->type
);
2239 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2240 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2241 d
->needs_rearm
= true;
2248 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2254 assert(s
->event
->n_enabled_child_sources
> 0);
2255 s
->event
->n_enabled_child_sources
--;
2257 if (EVENT_SOURCE_WATCH_PIDFD(s
))
2258 source_child_pidfd_unregister(s
);
2260 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2266 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2271 case SOURCE_INOTIFY
:
2276 assert_not_reached("Wut? I shouldn't exist.");
2281 /* Unset the pending flag when this event source is enabled */
2282 if (s
->enabled
== SD_EVENT_OFF
&& !IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
2283 r
= source_set_pending(s
, false);
2291 r
= source_io_register(s
, m
, s
->io
.events
);
2298 case SOURCE_TIME_REALTIME
:
2299 case SOURCE_TIME_BOOTTIME
:
2300 case SOURCE_TIME_MONOTONIC
:
2301 case SOURCE_TIME_REALTIME_ALARM
:
2302 case SOURCE_TIME_BOOTTIME_ALARM
: {
2303 struct clock_data
*d
;
2306 d
= event_get_clock_data(s
->event
, s
->type
);
2309 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2310 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2311 d
->needs_rearm
= true;
2319 r
= event_make_signal_data(s
->event
, s
->signal
.sig
, NULL
);
2321 s
->enabled
= SD_EVENT_OFF
;
2322 event_gc_signal_data(s
->event
, &s
->priority
, s
->signal
.sig
);
2330 if (s
->enabled
== SD_EVENT_OFF
)
2331 s
->event
->n_enabled_child_sources
++;
2335 if (EVENT_SOURCE_WATCH_PIDFD(s
)) {
2336 /* yes, we have pidfd */
2338 r
= source_child_pidfd_register(s
, s
->enabled
);
2340 s
->enabled
= SD_EVENT_OFF
;
2341 s
->event
->n_enabled_child_sources
--;
2345 /* no pidfd, or something other to watch for than WEXITED */
2347 r
= event_make_signal_data(s
->event
, SIGCHLD
, NULL
);
2349 s
->enabled
= SD_EVENT_OFF
;
2350 s
->event
->n_enabled_child_sources
--;
2351 event_gc_signal_data(s
->event
, &s
->priority
, SIGCHLD
);
2360 prioq_reshuffle(s
->event
->exit
, s
, &s
->exit
.prioq_index
);
2365 case SOURCE_INOTIFY
:
2370 assert_not_reached("Wut? I shouldn't exist.");
2375 prioq_reshuffle(s
->event
->pending
, s
, &s
->pending_index
);
2378 prioq_reshuffle(s
->event
->prepare
, s
, &s
->prepare_index
);
2383 _public_
int sd_event_source_get_time(sd_event_source
*s
, uint64_t *usec
) {
2384 assert_return(s
, -EINVAL
);
2385 assert_return(usec
, -EINVAL
);
2386 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2387 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2389 *usec
= s
->time
.next
;
2393 _public_
int sd_event_source_set_time(sd_event_source
*s
, uint64_t usec
) {
2394 struct clock_data
*d
;
2397 assert_return(s
, -EINVAL
);
2398 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2399 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2400 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2402 r
= source_set_pending(s
, false);
2406 s
->time
.next
= usec
;
2408 d
= event_get_clock_data(s
->event
, s
->type
);
2411 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2412 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2413 d
->needs_rearm
= true;
2418 _public_
int sd_event_source_get_time_accuracy(sd_event_source
*s
, uint64_t *usec
) {
2419 assert_return(s
, -EINVAL
);
2420 assert_return(usec
, -EINVAL
);
2421 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2422 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2424 *usec
= s
->time
.accuracy
;
2428 _public_
int sd_event_source_set_time_accuracy(sd_event_source
*s
, uint64_t usec
) {
2429 struct clock_data
*d
;
2432 assert_return(s
, -EINVAL
);
2433 assert_return(usec
!= (uint64_t) -1, -EINVAL
);
2434 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2435 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2436 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2438 r
= source_set_pending(s
, false);
2443 usec
= DEFAULT_ACCURACY_USEC
;
2445 s
->time
.accuracy
= usec
;
2447 d
= event_get_clock_data(s
->event
, s
->type
);
2450 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2451 d
->needs_rearm
= true;
2456 _public_
int sd_event_source_get_time_clock(sd_event_source
*s
, clockid_t
*clock
) {
2457 assert_return(s
, -EINVAL
);
2458 assert_return(clock
, -EINVAL
);
2459 assert_return(EVENT_SOURCE_IS_TIME(s
->type
), -EDOM
);
2460 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2462 *clock
= event_source_type_to_clock(s
->type
);
2466 _public_
int sd_event_source_get_child_pid(sd_event_source
*s
, pid_t
*pid
) {
2467 assert_return(s
, -EINVAL
);
2468 assert_return(pid
, -EINVAL
);
2469 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2470 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2472 *pid
= s
->child
.pid
;
2476 _public_
int sd_event_source_get_child_pidfd(sd_event_source
*s
) {
2477 assert_return(s
, -EINVAL
);
2478 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2479 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2481 if (s
->child
.pidfd
< 0)
2484 return s
->child
.pidfd
;
2487 _public_
int sd_event_source_send_child_signal(sd_event_source
*s
, int sig
, const siginfo_t
*si
, unsigned flags
) {
2488 assert_return(s
, -EINVAL
);
2489 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2490 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2491 assert_return(SIGNAL_VALID(sig
), -EINVAL
);
2493 /* If we already have seen indication the process exited refuse sending a signal early. This way we
2494 * can be sure we don't accidentally kill the wrong process on PID reuse when pidfds are not
2496 if (s
->child
.exited
)
2499 if (s
->child
.pidfd
>= 0) {
2502 /* pidfd_send_signal() changes the siginfo_t argument. This is weird, let's hence copy the
2507 if (pidfd_send_signal(s
->child
.pidfd
, sig
, si
? ©
: NULL
, 0) < 0) {
2508 /* Let's propagate the error only if the system call is not implemented or prohibited */
2509 if (!ERRNO_IS_NOT_SUPPORTED(errno
) && !ERRNO_IS_PRIVILEGE(errno
))
2515 /* Flags are only supported for pidfd_send_signal(), not for rt_sigqueueinfo(), hence let's refuse
2521 /* We use rt_sigqueueinfo() only if siginfo_t is specified. */
2522 siginfo_t copy
= *si
;
2524 if (rt_sigqueueinfo(s
->child
.pid
, sig
, ©
) < 0)
2526 } else if (kill(s
->child
.pid
, sig
) < 0)
2532 _public_
int sd_event_source_get_child_pidfd_own(sd_event_source
*s
) {
2533 assert_return(s
, -EINVAL
);
2534 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2536 if (s
->child
.pidfd
< 0)
2539 return s
->child
.pidfd_owned
;
2542 _public_
int sd_event_source_set_child_pidfd_own(sd_event_source
*s
, int own
) {
2543 assert_return(s
, -EINVAL
);
2544 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2546 if (s
->child
.pidfd
< 0)
2549 s
->child
.pidfd_owned
= own
;
2553 _public_
int sd_event_source_get_child_process_own(sd_event_source
*s
) {
2554 assert_return(s
, -EINVAL
);
2555 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2557 return s
->child
.process_owned
;
2560 _public_
int sd_event_source_set_child_process_own(sd_event_source
*s
, int own
) {
2561 assert_return(s
, -EINVAL
);
2562 assert_return(s
->type
== SOURCE_CHILD
, -EDOM
);
2564 s
->child
.process_owned
= own
;
2568 _public_
int sd_event_source_get_inotify_mask(sd_event_source
*s
, uint32_t *mask
) {
2569 assert_return(s
, -EINVAL
);
2570 assert_return(mask
, -EINVAL
);
2571 assert_return(s
->type
== SOURCE_INOTIFY
, -EDOM
);
2572 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2574 *mask
= s
->inotify
.mask
;
2578 _public_
int sd_event_source_set_prepare(sd_event_source
*s
, sd_event_handler_t callback
) {
2581 assert_return(s
, -EINVAL
);
2582 assert_return(s
->type
!= SOURCE_EXIT
, -EDOM
);
2583 assert_return(s
->event
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
2584 assert_return(!event_pid_changed(s
->event
), -ECHILD
);
2586 if (s
->prepare
== callback
)
2589 if (callback
&& s
->prepare
) {
2590 s
->prepare
= callback
;
2594 r
= prioq_ensure_allocated(&s
->event
->prepare
, prepare_prioq_compare
);
2598 s
->prepare
= callback
;
2601 r
= prioq_put(s
->event
->prepare
, s
, &s
->prepare_index
);
2605 prioq_remove(s
->event
->prepare
, s
, &s
->prepare_index
);
2610 _public_
void* sd_event_source_get_userdata(sd_event_source
*s
) {
2611 assert_return(s
, NULL
);
2616 _public_
void *sd_event_source_set_userdata(sd_event_source
*s
, void *userdata
) {
2619 assert_return(s
, NULL
);
2622 s
->userdata
= userdata
;
2627 static usec_t
sleep_between(sd_event
*e
, usec_t a
, usec_t b
) {
2634 if (a
>= USEC_INFINITY
)
2635 return USEC_INFINITY
;
2640 initialize_perturb(e
);
2643 Find a good time to wake up again between times a and b. We
2644 have two goals here:
2646 a) We want to wake up as seldom as possible, hence prefer
2647 later times over earlier times.
2649 b) But if we have to wake up, then let's make sure to
2650 dispatch as much as possible on the entire system.
2652 We implement this by waking up everywhere at the same time
2653 within any given minute if we can, synchronised via the
2654 perturbation value determined from the boot ID. If we can't,
2655 then we try to find the same spot in every 10s, then 1s and
2656 then 250ms step. Otherwise, we pick the last possible time
2660 c
= (b
/ USEC_PER_MINUTE
) * USEC_PER_MINUTE
+ e
->perturb
;
2662 if (_unlikely_(c
< USEC_PER_MINUTE
))
2665 c
-= USEC_PER_MINUTE
;
2671 c
= (b
/ (USEC_PER_SEC
*10)) * (USEC_PER_SEC
*10) + (e
->perturb
% (USEC_PER_SEC
*10));
2673 if (_unlikely_(c
< USEC_PER_SEC
*10))
2676 c
-= USEC_PER_SEC
*10;
2682 c
= (b
/ USEC_PER_SEC
) * USEC_PER_SEC
+ (e
->perturb
% USEC_PER_SEC
);
2684 if (_unlikely_(c
< USEC_PER_SEC
))
2693 c
= (b
/ (USEC_PER_MSEC
*250)) * (USEC_PER_MSEC
*250) + (e
->perturb
% (USEC_PER_MSEC
*250));
2695 if (_unlikely_(c
< USEC_PER_MSEC
*250))
2698 c
-= USEC_PER_MSEC
*250;
2707 static int event_arm_timer(
2709 struct clock_data
*d
) {
2711 struct itimerspec its
= {};
2712 sd_event_source
*a
, *b
;
2719 if (!d
->needs_rearm
)
2722 d
->needs_rearm
= false;
2724 a
= prioq_peek(d
->earliest
);
2725 if (!a
|| a
->enabled
== SD_EVENT_OFF
|| a
->time
.next
== USEC_INFINITY
) {
2730 if (d
->next
== USEC_INFINITY
)
2734 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2738 d
->next
= USEC_INFINITY
;
2742 b
= prioq_peek(d
->latest
);
2743 assert_se(b
&& b
->enabled
!= SD_EVENT_OFF
);
2745 t
= sleep_between(e
, a
->time
.next
, time_event_source_latest(b
));
2749 assert_se(d
->fd
>= 0);
2752 /* We don' want to disarm here, just mean some time looooong ago. */
2753 its
.it_value
.tv_sec
= 0;
2754 its
.it_value
.tv_nsec
= 1;
2756 timespec_store(&its
.it_value
, t
);
2758 r
= timerfd_settime(d
->fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
2766 static int process_io(sd_event
*e
, sd_event_source
*s
, uint32_t revents
) {
2769 assert(s
->type
== SOURCE_IO
);
2771 /* If the event source was already pending, we just OR in the
2772 * new revents, otherwise we reset the value. The ORing is
2773 * necessary to handle EPOLLONESHOT events properly where
2774 * readability might happen independently of writability, and
2775 * we need to keep track of both */
2778 s
->io
.revents
|= revents
;
2780 s
->io
.revents
= revents
;
2782 return source_set_pending(s
, true);
2785 static int flush_timer(sd_event
*e
, int fd
, uint32_t events
, usec_t
*next
) {
2792 assert_return(events
== EPOLLIN
, -EIO
);
2794 ss
= read(fd
, &x
, sizeof(x
));
2796 if (IN_SET(errno
, EAGAIN
, EINTR
))
2802 if (_unlikely_(ss
!= sizeof(x
)))
2806 *next
= USEC_INFINITY
;
2811 static int process_timer(
2814 struct clock_data
*d
) {
2823 s
= prioq_peek(d
->earliest
);
2826 s
->enabled
== SD_EVENT_OFF
||
2830 r
= source_set_pending(s
, true);
2834 prioq_reshuffle(d
->earliest
, s
, &s
->time
.earliest_index
);
2835 prioq_reshuffle(d
->latest
, s
, &s
->time
.latest_index
);
2836 d
->needs_rearm
= true;
2842 static int process_child(sd_event
*e
) {
2849 e
->need_process_child
= false;
2852 So, this is ugly. We iteratively invoke waitid() with P_PID
2853 + WNOHANG for each PID we wait for, instead of using
2854 P_ALL. This is because we only want to get child
2855 information of very specific child processes, and not all
2856 of them. We might not have processed the SIGCHLD even of a
2857 previous invocation and we don't want to maintain a
2858 unbounded *per-child* event queue, hence we really don't
2859 want anything flushed out of the kernel's queue that we
2860 don't care about. Since this is O(n) this means that if you
2861 have a lot of processes you probably want to handle SIGCHLD
2864 We do not reap the children here (by using WNOWAIT), this
2865 is only done after the event source is dispatched so that
2866 the callback still sees the process as a zombie.
2869 HASHMAP_FOREACH(s
, e
->child_sources
, i
) {
2870 assert(s
->type
== SOURCE_CHILD
);
2875 if (s
->enabled
== SD_EVENT_OFF
)
2878 if (s
->child
.exited
)
2881 if (EVENT_SOURCE_WATCH_PIDFD(s
)) /* There's a usable pidfd known for this event source? then don't waitid() for it here */
2884 zero(s
->child
.siginfo
);
2885 r
= waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
,
2886 WNOHANG
| (s
->child
.options
& WEXITED
? WNOWAIT
: 0) | s
->child
.options
);
2890 if (s
->child
.siginfo
.si_pid
!= 0) {
2891 bool zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
2894 s
->child
.exited
= true;
2896 if (!zombie
&& (s
->child
.options
& WEXITED
)) {
2897 /* If the child isn't dead then let's
2898 * immediately remove the state change
2899 * from the queue, since there's no
2900 * benefit in leaving it queued */
2902 assert(s
->child
.options
& (WSTOPPED
|WCONTINUED
));
2903 (void) waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|(s
->child
.options
& (WSTOPPED
|WCONTINUED
)));
2906 r
= source_set_pending(s
, true);
2915 static int process_pidfd(sd_event
*e
, sd_event_source
*s
, uint32_t revents
) {
2918 assert(s
->type
== SOURCE_CHILD
);
2923 if (s
->enabled
== SD_EVENT_OFF
)
2926 if (!EVENT_SOURCE_WATCH_PIDFD(s
))
2929 zero(s
->child
.siginfo
);
2930 if (waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
| WNOWAIT
| s
->child
.options
) < 0)
2933 if (s
->child
.siginfo
.si_pid
== 0)
2936 if (IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
))
2937 s
->child
.exited
= true;
2939 return source_set_pending(s
, true);
2942 static int process_signal(sd_event
*e
, struct signal_data
*d
, uint32_t events
) {
2943 bool read_one
= false;
2948 assert_return(events
== EPOLLIN
, -EIO
);
2950 /* If there's a signal queued on this priority and SIGCHLD is
2951 on this priority too, then make sure to recheck the
2952 children we watch. This is because we only ever dequeue
2953 the first signal per priority, and if we dequeue one, and
2954 SIGCHLD might be enqueued later we wouldn't know, but we
2955 might have higher priority children we care about hence we
2956 need to check that explicitly. */
2958 if (sigismember(&d
->sigset
, SIGCHLD
))
2959 e
->need_process_child
= true;
2961 /* If there's already an event source pending for this
2962 * priority we don't read another */
2967 struct signalfd_siginfo si
;
2969 sd_event_source
*s
= NULL
;
2971 n
= read(d
->fd
, &si
, sizeof(si
));
2973 if (IN_SET(errno
, EAGAIN
, EINTR
))
2979 if (_unlikely_(n
!= sizeof(si
)))
2982 assert(SIGNAL_VALID(si
.ssi_signo
));
2986 if (e
->signal_sources
)
2987 s
= e
->signal_sources
[si
.ssi_signo
];
2993 s
->signal
.siginfo
= si
;
2996 r
= source_set_pending(s
, true);
3004 static int event_inotify_data_read(sd_event
*e
, struct inotify_data
*d
, uint32_t revents
) {
3010 assert_return(revents
== EPOLLIN
, -EIO
);
3012 /* If there's already an event source pending for this priority, don't read another */
3013 if (d
->n_pending
> 0)
3016 /* Is the read buffer non-empty? If so, let's not read more */
3017 if (d
->buffer_filled
> 0)
3020 n
= read(d
->fd
, &d
->buffer
, sizeof(d
->buffer
));
3022 if (IN_SET(errno
, EAGAIN
, EINTR
))
3029 d
->buffer_filled
= (size_t) n
;
3030 LIST_PREPEND(buffered
, e
->inotify_data_buffered
, d
);
3035 static void event_inotify_data_drop(sd_event
*e
, struct inotify_data
*d
, size_t sz
) {
3038 assert(sz
<= d
->buffer_filled
);
3043 /* Move the rest to the buffer to the front, in order to get things properly aligned again */
3044 memmove(d
->buffer
.raw
, d
->buffer
.raw
+ sz
, d
->buffer_filled
- sz
);
3045 d
->buffer_filled
-= sz
;
3047 if (d
->buffer_filled
== 0)
3048 LIST_REMOVE(buffered
, e
->inotify_data_buffered
, d
);
3051 static int event_inotify_data_process(sd_event
*e
, struct inotify_data
*d
) {
3057 /* If there's already an event source pending for this priority, don't read another */
3058 if (d
->n_pending
> 0)
3061 while (d
->buffer_filled
> 0) {
3064 /* Let's validate that the event structures are complete */
3065 if (d
->buffer_filled
< offsetof(struct inotify_event
, name
))
3068 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
3069 if (d
->buffer_filled
< sz
)
3072 if (d
->buffer
.ev
.mask
& IN_Q_OVERFLOW
) {
3073 struct inode_data
*inode_data
;
3076 /* The queue overran, let's pass this event to all event sources connected to this inotify
3079 HASHMAP_FOREACH(inode_data
, d
->inodes
, i
) {
3082 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
3084 if (s
->enabled
== SD_EVENT_OFF
)
3087 r
= source_set_pending(s
, true);
3093 struct inode_data
*inode_data
;
3096 /* Find the inode object for this watch descriptor. If IN_IGNORED is set we also remove it from
3097 * our watch descriptor table. */
3098 if (d
->buffer
.ev
.mask
& IN_IGNORED
) {
3100 inode_data
= hashmap_remove(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
3102 event_inotify_data_drop(e
, d
, sz
);
3106 /* The watch descriptor was removed by the kernel, let's drop it here too */
3107 inode_data
->wd
= -1;
3109 inode_data
= hashmap_get(d
->wd
, INT_TO_PTR(d
->buffer
.ev
.wd
));
3111 event_inotify_data_drop(e
, d
, sz
);
3116 /* Trigger all event sources that are interested in these events. Also trigger all event
3117 * sources if IN_IGNORED or IN_UNMOUNT is set. */
3118 LIST_FOREACH(inotify
.by_inode_data
, s
, inode_data
->event_sources
) {
3120 if (s
->enabled
== SD_EVENT_OFF
)
3123 if ((d
->buffer
.ev
.mask
& (IN_IGNORED
|IN_UNMOUNT
)) == 0 &&
3124 (s
->inotify
.mask
& d
->buffer
.ev
.mask
& IN_ALL_EVENTS
) == 0)
3127 r
= source_set_pending(s
, true);
3133 /* Something pending now? If so, let's finish, otherwise let's read more. */
3134 if (d
->n_pending
> 0)
3141 static int process_inotify(sd_event
*e
) {
3142 struct inotify_data
*d
;
3147 LIST_FOREACH(buffered
, d
, e
->inotify_data_buffered
) {
3148 r
= event_inotify_data_process(e
, d
);
3158 static int source_dispatch(sd_event_source
*s
) {
3159 EventSourceType saved_type
;
3163 assert(s
->pending
|| s
->type
== SOURCE_EXIT
);
3165 /* Save the event source type, here, so that we still know it after the event callback which might invalidate
3167 saved_type
= s
->type
;
3169 if (!IN_SET(s
->type
, SOURCE_DEFER
, SOURCE_EXIT
)) {
3170 r
= source_set_pending(s
, false);
3175 if (s
->type
!= SOURCE_POST
) {
3179 /* If we execute a non-post source, let's mark all
3180 * post sources as pending */
3182 SET_FOREACH(z
, s
->event
->post_sources
, i
) {
3183 if (z
->enabled
== SD_EVENT_OFF
)
3186 r
= source_set_pending(z
, true);
3192 if (s
->enabled
== SD_EVENT_ONESHOT
) {
3193 r
= sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3198 s
->dispatching
= true;
3203 r
= s
->io
.callback(s
, s
->io
.fd
, s
->io
.revents
, s
->userdata
);
3206 case SOURCE_TIME_REALTIME
:
3207 case SOURCE_TIME_BOOTTIME
:
3208 case SOURCE_TIME_MONOTONIC
:
3209 case SOURCE_TIME_REALTIME_ALARM
:
3210 case SOURCE_TIME_BOOTTIME_ALARM
:
3211 r
= s
->time
.callback(s
, s
->time
.next
, s
->userdata
);
3215 r
= s
->signal
.callback(s
, &s
->signal
.siginfo
, s
->userdata
);
3218 case SOURCE_CHILD
: {
3221 zombie
= IN_SET(s
->child
.siginfo
.si_code
, CLD_EXITED
, CLD_KILLED
, CLD_DUMPED
);
3223 r
= s
->child
.callback(s
, &s
->child
.siginfo
, s
->userdata
);
3225 /* Now, reap the PID for good. */
3227 (void) waitid(P_PID
, s
->child
.pid
, &s
->child
.siginfo
, WNOHANG
|WEXITED
);
3228 s
->child
.waited
= true;
3235 r
= s
->defer
.callback(s
, s
->userdata
);
3239 r
= s
->post
.callback(s
, s
->userdata
);
3243 r
= s
->exit
.callback(s
, s
->userdata
);
3246 case SOURCE_INOTIFY
: {
3247 struct sd_event
*e
= s
->event
;
3248 struct inotify_data
*d
;
3251 assert(s
->inotify
.inode_data
);
3252 assert_se(d
= s
->inotify
.inode_data
->inotify_data
);
3254 assert(d
->buffer_filled
>= offsetof(struct inotify_event
, name
));
3255 sz
= offsetof(struct inotify_event
, name
) + d
->buffer
.ev
.len
;
3256 assert(d
->buffer_filled
>= sz
);
3258 r
= s
->inotify
.callback(s
, &d
->buffer
.ev
, s
->userdata
);
3260 /* When no event is pending anymore on this inotify object, then let's drop the event from the
3262 if (d
->n_pending
== 0)
3263 event_inotify_data_drop(e
, d
, sz
);
3268 case SOURCE_WATCHDOG
:
3269 case _SOURCE_EVENT_SOURCE_TYPE_MAX
:
3270 case _SOURCE_EVENT_SOURCE_TYPE_INVALID
:
3271 assert_not_reached("Wut? I shouldn't exist.");
3274 s
->dispatching
= false;
3277 log_debug_errno(r
, "Event source %s (type %s) returned error, disabling: %m",
3278 strna(s
->description
), event_source_type_to_string(saved_type
));
3283 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3288 static int event_prepare(sd_event
*e
) {
3296 s
= prioq_peek(e
->prepare
);
3297 if (!s
|| s
->prepare_iteration
== e
->iteration
|| s
->enabled
== SD_EVENT_OFF
)
3300 s
->prepare_iteration
= e
->iteration
;
3301 r
= prioq_reshuffle(e
->prepare
, s
, &s
->prepare_index
);
3307 s
->dispatching
= true;
3308 r
= s
->prepare(s
, s
->userdata
);
3309 s
->dispatching
= false;
3312 log_debug_errno(r
, "Prepare callback of event source %s (type %s) returned error, disabling: %m",
3313 strna(s
->description
), event_source_type_to_string(s
->type
));
3318 sd_event_source_set_enabled(s
, SD_EVENT_OFF
);
3324 static int dispatch_exit(sd_event
*e
) {
3326 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3331 p
= prioq_peek(e
->exit
);
3332 if (!p
|| p
->enabled
== SD_EVENT_OFF
) {
3333 e
->state
= SD_EVENT_FINISHED
;
3337 ref
= sd_event_ref(e
);
3339 e
->state
= SD_EVENT_EXITING
;
3340 r
= source_dispatch(p
);
3341 e
->state
= SD_EVENT_INITIAL
;
3345 static sd_event_source
* event_next_pending(sd_event
*e
) {
3350 p
= prioq_peek(e
->pending
);
3354 if (p
->enabled
== SD_EVENT_OFF
)
3360 static int arm_watchdog(sd_event
*e
) {
3361 struct itimerspec its
= {};
3366 assert(e
->watchdog_fd
>= 0);
3368 t
= sleep_between(e
,
3369 e
->watchdog_last
+ (e
->watchdog_period
/ 2),
3370 e
->watchdog_last
+ (e
->watchdog_period
* 3 / 4));
3372 timespec_store(&its
.it_value
, t
);
3374 /* Make sure we never set the watchdog to 0, which tells the
3375 * kernel to disable it. */
3376 if (its
.it_value
.tv_sec
== 0 && its
.it_value
.tv_nsec
== 0)
3377 its
.it_value
.tv_nsec
= 1;
3379 r
= timerfd_settime(e
->watchdog_fd
, TFD_TIMER_ABSTIME
, &its
, NULL
);
3386 static int process_watchdog(sd_event
*e
) {
3392 /* Don't notify watchdog too often */
3393 if (e
->watchdog_last
+ e
->watchdog_period
/ 4 > e
->timestamp
.monotonic
)
3396 sd_notify(false, "WATCHDOG=1");
3397 e
->watchdog_last
= e
->timestamp
.monotonic
;
3399 return arm_watchdog(e
);
3402 static void event_close_inode_data_fds(sd_event
*e
) {
3403 struct inode_data
*d
;
3407 /* Close the fds pointing to the inodes to watch now. We need to close them as they might otherwise pin
3408 * filesystems. But we can't close them right-away as we need them as long as the user still wants to make
3409 * adjustments to the even source, such as changing the priority (which requires us to remove and re-add a watch
3410 * for the inode). Hence, let's close them when entering the first iteration after they were added, as a
3413 while ((d
= e
->inode_data_to_close
)) {
3415 d
->fd
= safe_close(d
->fd
);
3417 LIST_REMOVE(to_close
, e
->inode_data_to_close
, d
);
3421 _public_
int sd_event_prepare(sd_event
*e
) {
3424 assert_return(e
, -EINVAL
);
3425 assert_return(e
= event_resolve(e
), -ENOPKG
);
3426 assert_return(!event_pid_changed(e
), -ECHILD
);
3427 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3428 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3430 /* Let's check that if we are a default event loop we are executed in the correct thread. We only do
3431 * this check here once, since gettid() is typically not cached, and thus want to minimize
3433 assert_return(!e
->default_event_ptr
|| e
->tid
== gettid(), -EREMOTEIO
);
3435 if (e
->exit_requested
)
3440 e
->state
= SD_EVENT_PREPARING
;
3441 r
= event_prepare(e
);
3442 e
->state
= SD_EVENT_INITIAL
;
3446 r
= event_arm_timer(e
, &e
->realtime
);
3450 r
= event_arm_timer(e
, &e
->boottime
);
3454 r
= event_arm_timer(e
, &e
->monotonic
);
3458 r
= event_arm_timer(e
, &e
->realtime_alarm
);
3462 r
= event_arm_timer(e
, &e
->boottime_alarm
);
3466 event_close_inode_data_fds(e
);
3468 if (event_next_pending(e
) || e
->need_process_child
)
3471 e
->state
= SD_EVENT_ARMED
;
3476 e
->state
= SD_EVENT_ARMED
;
3477 r
= sd_event_wait(e
, 0);
3479 e
->state
= SD_EVENT_ARMED
;
3484 _public_
int sd_event_wait(sd_event
*e
, uint64_t timeout
) {
3485 size_t event_queue_max
;
3488 assert_return(e
, -EINVAL
);
3489 assert_return(e
= event_resolve(e
), -ENOPKG
);
3490 assert_return(!event_pid_changed(e
), -ECHILD
);
3491 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3492 assert_return(e
->state
== SD_EVENT_ARMED
, -EBUSY
);
3494 if (e
->exit_requested
) {
3495 e
->state
= SD_EVENT_PENDING
;
3499 event_queue_max
= MAX(e
->n_sources
, 1u);
3500 if (!GREEDY_REALLOC(e
->event_queue
, e
->event_queue_allocated
, event_queue_max
))
3503 /* If we still have inotify data buffered, then query the other fds, but don't wait on it */
3504 if (e
->inotify_data_buffered
)
3507 m
= epoll_wait(e
->epoll_fd
, e
->event_queue
, event_queue_max
,
3508 timeout
== (uint64_t) -1 ? -1 : (int) DIV_ROUND_UP(timeout
, USEC_PER_MSEC
));
3510 if (errno
== EINTR
) {
3511 e
->state
= SD_EVENT_PENDING
;
3519 triple_timestamp_get(&e
->timestamp
);
3521 for (i
= 0; i
< m
; i
++) {
3523 if (e
->event_queue
[i
].data
.ptr
== INT_TO_PTR(SOURCE_WATCHDOG
))
3524 r
= flush_timer(e
, e
->watchdog_fd
, e
->event_queue
[i
].events
, NULL
);
3526 WakeupType
*t
= e
->event_queue
[i
].data
.ptr
;
3530 case WAKEUP_EVENT_SOURCE
: {
3531 sd_event_source
*s
= e
->event_queue
[i
].data
.ptr
;
3538 r
= process_io(e
, s
, e
->event_queue
[i
].events
);
3542 r
= process_pidfd(e
, s
, e
->event_queue
[i
].events
);
3546 assert_not_reached("Unexpected event source type");
3552 case WAKEUP_CLOCK_DATA
: {
3553 struct clock_data
*d
= e
->event_queue
[i
].data
.ptr
;
3557 r
= flush_timer(e
, d
->fd
, e
->event_queue
[i
].events
, &d
->next
);
3561 case WAKEUP_SIGNAL_DATA
:
3562 r
= process_signal(e
, e
->event_queue
[i
].data
.ptr
, e
->event_queue
[i
].events
);
3565 case WAKEUP_INOTIFY_DATA
:
3566 r
= event_inotify_data_read(e
, e
->event_queue
[i
].data
.ptr
, e
->event_queue
[i
].events
);
3570 assert_not_reached("Invalid wake-up pointer");
3577 r
= process_watchdog(e
);
3581 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime
);
3585 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime
);
3589 r
= process_timer(e
, e
->timestamp
.monotonic
, &e
->monotonic
);
3593 r
= process_timer(e
, e
->timestamp
.realtime
, &e
->realtime_alarm
);
3597 r
= process_timer(e
, e
->timestamp
.boottime
, &e
->boottime_alarm
);
3601 if (e
->need_process_child
) {
3602 r
= process_child(e
);
3607 r
= process_inotify(e
);
3611 if (event_next_pending(e
)) {
3612 e
->state
= SD_EVENT_PENDING
;
3620 e
->state
= SD_EVENT_INITIAL
;
3625 _public_
int sd_event_dispatch(sd_event
*e
) {
3629 assert_return(e
, -EINVAL
);
3630 assert_return(e
= event_resolve(e
), -ENOPKG
);
3631 assert_return(!event_pid_changed(e
), -ECHILD
);
3632 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3633 assert_return(e
->state
== SD_EVENT_PENDING
, -EBUSY
);
3635 if (e
->exit_requested
)
3636 return dispatch_exit(e
);
3638 p
= event_next_pending(e
);
3640 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3642 ref
= sd_event_ref(e
);
3643 e
->state
= SD_EVENT_RUNNING
;
3644 r
= source_dispatch(p
);
3645 e
->state
= SD_EVENT_INITIAL
;
3649 e
->state
= SD_EVENT_INITIAL
;
3654 static void event_log_delays(sd_event
*e
) {
3655 char b
[ELEMENTSOF(e
->delays
) * DECIMAL_STR_MAX(unsigned) + 1], *p
;
3660 for (i
= 0; i
< ELEMENTSOF(e
->delays
); i
++) {
3661 l
= strpcpyf(&p
, l
, "%u ", e
->delays
[i
]);
3664 log_debug("Event loop iterations: %s", b
);
3667 _public_
int sd_event_run(sd_event
*e
, uint64_t timeout
) {
3670 assert_return(e
, -EINVAL
);
3671 assert_return(e
= event_resolve(e
), -ENOPKG
);
3672 assert_return(!event_pid_changed(e
), -ECHILD
);
3673 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3674 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3676 if (e
->profile_delays
&& e
->last_run
) {
3680 this_run
= now(CLOCK_MONOTONIC
);
3682 l
= u64log2(this_run
- e
->last_run
);
3683 assert(l
< sizeof(e
->delays
));
3686 if (this_run
- e
->last_log
>= 5*USEC_PER_SEC
) {
3687 event_log_delays(e
);
3688 e
->last_log
= this_run
;
3692 r
= sd_event_prepare(e
);
3694 /* There was nothing? Then wait... */
3695 r
= sd_event_wait(e
, timeout
);
3697 if (e
->profile_delays
)
3698 e
->last_run
= now(CLOCK_MONOTONIC
);
3701 /* There's something now, then let's dispatch it */
3702 r
= sd_event_dispatch(e
);
3712 _public_
int sd_event_loop(sd_event
*e
) {
3713 _cleanup_(sd_event_unrefp
) sd_event
*ref
= NULL
;
3716 assert_return(e
, -EINVAL
);
3717 assert_return(e
= event_resolve(e
), -ENOPKG
);
3718 assert_return(!event_pid_changed(e
), -ECHILD
);
3719 assert_return(e
->state
== SD_EVENT_INITIAL
, -EBUSY
);
3721 ref
= sd_event_ref(e
);
3723 while (e
->state
!= SD_EVENT_FINISHED
) {
3724 r
= sd_event_run(e
, (uint64_t) -1);
3729 return e
->exit_code
;
3732 _public_
int sd_event_get_fd(sd_event
*e
) {
3734 assert_return(e
, -EINVAL
);
3735 assert_return(e
= event_resolve(e
), -ENOPKG
);
3736 assert_return(!event_pid_changed(e
), -ECHILD
);
3741 _public_
int sd_event_get_state(sd_event
*e
) {
3742 assert_return(e
, -EINVAL
);
3743 assert_return(e
= event_resolve(e
), -ENOPKG
);
3744 assert_return(!event_pid_changed(e
), -ECHILD
);
3749 _public_
int sd_event_get_exit_code(sd_event
*e
, int *code
) {
3750 assert_return(e
, -EINVAL
);
3751 assert_return(e
= event_resolve(e
), -ENOPKG
);
3752 assert_return(code
, -EINVAL
);
3753 assert_return(!event_pid_changed(e
), -ECHILD
);
3755 if (!e
->exit_requested
)
3758 *code
= e
->exit_code
;
3762 _public_
int sd_event_exit(sd_event
*e
, int code
) {
3763 assert_return(e
, -EINVAL
);
3764 assert_return(e
= event_resolve(e
), -ENOPKG
);
3765 assert_return(e
->state
!= SD_EVENT_FINISHED
, -ESTALE
);
3766 assert_return(!event_pid_changed(e
), -ECHILD
);
3768 e
->exit_requested
= true;
3769 e
->exit_code
= code
;
3774 _public_
int sd_event_now(sd_event
*e
, clockid_t clock
, uint64_t *usec
) {
3775 assert_return(e
, -EINVAL
);
3776 assert_return(e
= event_resolve(e
), -ENOPKG
);
3777 assert_return(usec
, -EINVAL
);
3778 assert_return(!event_pid_changed(e
), -ECHILD
);
3780 if (!TRIPLE_TIMESTAMP_HAS_CLOCK(clock
))
3783 /* Generate a clean error in case CLOCK_BOOTTIME is not available. Note that don't use clock_supported() here,
3784 * for a reason: there are systems where CLOCK_BOOTTIME is supported, but CLOCK_BOOTTIME_ALARM is not, but for
3785 * the purpose of getting the time this doesn't matter. */
3786 if (IN_SET(clock
, CLOCK_BOOTTIME
, CLOCK_BOOTTIME_ALARM
) && !clock_boottime_supported())
3789 if (!triple_timestamp_is_set(&e
->timestamp
)) {
3790 /* Implicitly fall back to now() if we never ran
3791 * before and thus have no cached time. */
3796 *usec
= triple_timestamp_by_clock(&e
->timestamp
, clock
);
3800 _public_
int sd_event_default(sd_event
**ret
) {
3805 return !!default_event
;
3807 if (default_event
) {
3808 *ret
= sd_event_ref(default_event
);
3812 r
= sd_event_new(&e
);
3816 e
->default_event_ptr
= &default_event
;
3824 _public_
int sd_event_get_tid(sd_event
*e
, pid_t
*tid
) {
3825 assert_return(e
, -EINVAL
);
3826 assert_return(e
= event_resolve(e
), -ENOPKG
);
3827 assert_return(tid
, -EINVAL
);
3828 assert_return(!event_pid_changed(e
), -ECHILD
);
3838 _public_
int sd_event_set_watchdog(sd_event
*e
, int b
) {
3841 assert_return(e
, -EINVAL
);
3842 assert_return(e
= event_resolve(e
), -ENOPKG
);
3843 assert_return(!event_pid_changed(e
), -ECHILD
);
3845 if (e
->watchdog
== !!b
)
3849 struct epoll_event ev
;
3851 r
= sd_watchdog_enabled(false, &e
->watchdog_period
);
3855 /* Issue first ping immediately */
3856 sd_notify(false, "WATCHDOG=1");
3857 e
->watchdog_last
= now(CLOCK_MONOTONIC
);
3859 e
->watchdog_fd
= timerfd_create(CLOCK_MONOTONIC
, TFD_NONBLOCK
|TFD_CLOEXEC
);
3860 if (e
->watchdog_fd
< 0)
3863 r
= arm_watchdog(e
);
3867 ev
= (struct epoll_event
) {
3869 .data
.ptr
= INT_TO_PTR(SOURCE_WATCHDOG
),
3872 r
= epoll_ctl(e
->epoll_fd
, EPOLL_CTL_ADD
, e
->watchdog_fd
, &ev
);
3879 if (e
->watchdog_fd
>= 0) {
3880 (void) epoll_ctl(e
->epoll_fd
, EPOLL_CTL_DEL
, e
->watchdog_fd
, NULL
);
3881 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3889 e
->watchdog_fd
= safe_close(e
->watchdog_fd
);
3893 _public_
int sd_event_get_watchdog(sd_event
*e
) {
3894 assert_return(e
, -EINVAL
);
3895 assert_return(e
= event_resolve(e
), -ENOPKG
);
3896 assert_return(!event_pid_changed(e
), -ECHILD
);
3901 _public_
int sd_event_get_iteration(sd_event
*e
, uint64_t *ret
) {
3902 assert_return(e
, -EINVAL
);
3903 assert_return(e
= event_resolve(e
), -ENOPKG
);
3904 assert_return(!event_pid_changed(e
), -ECHILD
);
3906 *ret
= e
->iteration
;
3910 _public_
int sd_event_source_set_destroy_callback(sd_event_source
*s
, sd_event_destroy_t callback
) {
3911 assert_return(s
, -EINVAL
);
3913 s
->destroy_callback
= callback
;
3917 _public_
int sd_event_source_get_destroy_callback(sd_event_source
*s
, sd_event_destroy_t
*ret
) {
3918 assert_return(s
, -EINVAL
);
3921 *ret
= s
->destroy_callback
;
3923 return !!s
->destroy_callback
;
3926 _public_
int sd_event_source_get_floating(sd_event_source
*s
) {
3927 assert_return(s
, -EINVAL
);
3932 _public_
int sd_event_source_set_floating(sd_event_source
*s
, int b
) {
3933 assert_return(s
, -EINVAL
);
3935 if (s
->floating
== !!b
)
3938 if (!s
->event
) /* Already disconnected */
3944 sd_event_source_ref(s
);
3945 sd_event_unref(s
->event
);
3947 sd_event_ref(s
->event
);
3948 sd_event_source_unref(s
);