1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/epoll.h>
23 #include <sys/inotify.h>
24 #include <sys/signalfd.h>
25 #include <sys/types.h>
29 #include "_sd-common.h"
32 Why is this better than pure epoll?
34 - Supports event source prioritization
35 - Scales better with a large number of time events because it does not require one timerfd each
36 - Automatically tries to coalesce timer events system-wide
37 - Handles signals, child PIDs, inotify events
38 - Supports systemd-style automatic watchdog event generation
41 _SD_BEGIN_DECLARATIONS
;
43 #define SD_EVENT_DEFAULT ((sd_event *) 1)
45 typedef struct sd_event sd_event
;
46 typedef struct sd_event_source sd_event_source
;
65 /* And everything in-between and outside is good too */
66 SD_EVENT_PRIORITY_IMPORTANT
= -100,
67 SD_EVENT_PRIORITY_NORMAL
= 0,
68 SD_EVENT_PRIORITY_IDLE
= 100
71 typedef int (*sd_event_handler_t
)(sd_event_source
*s
, void *userdata
);
72 typedef int (*sd_event_io_handler_t
)(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
);
73 typedef int (*sd_event_time_handler_t
)(sd_event_source
*s
, uint64_t usec
, void *userdata
);
74 typedef int (*sd_event_signal_handler_t
)(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
);
75 #if defined _GNU_SOURCE || (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L)
76 typedef int (*sd_event_child_handler_t
)(sd_event_source
*s
, const siginfo_t
*si
, void *userdata
);
78 typedef void* sd_event_child_handler_t
;
80 typedef int (*sd_event_inotify_handler_t
)(sd_event_source
*s
, const struct inotify_event
*event
, void *userdata
);
81 typedef _sd_destroy_t sd_event_destroy_t
;
83 int sd_event_default(sd_event
**e
);
85 int sd_event_new(sd_event
**e
);
86 sd_event
* sd_event_ref(sd_event
*e
);
87 sd_event
* sd_event_unref(sd_event
*e
);
89 int sd_event_add_io(sd_event
*e
, sd_event_source
**s
, int fd
, uint32_t events
, sd_event_io_handler_t callback
, void *userdata
);
90 int sd_event_add_time(sd_event
*e
, sd_event_source
**s
, clockid_t clock
, uint64_t usec
, uint64_t accuracy
, sd_event_time_handler_t callback
, void *userdata
);
91 int sd_event_add_time_relative(sd_event
*e
, sd_event_source
**s
, clockid_t clock
, uint64_t usec
, uint64_t accuracy
, sd_event_time_handler_t callback
, void *userdata
);
92 int sd_event_add_signal(sd_event
*e
, sd_event_source
**s
, int sig
, sd_event_signal_handler_t callback
, void *userdata
);
93 int sd_event_add_child(sd_event
*e
, sd_event_source
**s
, pid_t pid
, int options
, sd_event_child_handler_t callback
, void *userdata
);
94 int sd_event_add_child_pidfd(sd_event
*e
, sd_event_source
**s
, int pidfd
, int options
, sd_event_child_handler_t callback
, void *userdata
);
95 int sd_event_add_inotify(sd_event
*e
, sd_event_source
**s
, const char *path
, uint32_t mask
, sd_event_inotify_handler_t callback
, void *userdata
);
96 int sd_event_add_defer(sd_event
*e
, sd_event_source
**s
, sd_event_handler_t callback
, void *userdata
);
97 int sd_event_add_post(sd_event
*e
, sd_event_source
**s
, sd_event_handler_t callback
, void *userdata
);
98 int sd_event_add_exit(sd_event
*e
, sd_event_source
**s
, sd_event_handler_t callback
, void *userdata
);
100 int sd_event_prepare(sd_event
*e
);
101 int sd_event_wait(sd_event
*e
, uint64_t usec
);
102 int sd_event_dispatch(sd_event
*e
);
103 int sd_event_run(sd_event
*e
, uint64_t usec
);
104 int sd_event_loop(sd_event
*e
);
105 int sd_event_exit(sd_event
*e
, int code
);
107 int sd_event_now(sd_event
*e
, clockid_t clock
, uint64_t *usec
);
109 int sd_event_get_fd(sd_event
*e
);
110 int sd_event_get_state(sd_event
*e
);
111 int sd_event_get_tid(sd_event
*e
, pid_t
*tid
);
112 int sd_event_get_exit_code(sd_event
*e
, int *code
);
113 int sd_event_set_watchdog(sd_event
*e
, int b
);
114 int sd_event_get_watchdog(sd_event
*e
);
115 int sd_event_get_iteration(sd_event
*e
, uint64_t *ret
);
117 sd_event_source
* sd_event_source_ref(sd_event_source
*s
);
118 sd_event_source
* sd_event_source_unref(sd_event_source
*s
);
119 sd_event_source
* sd_event_source_disable_unref(sd_event_source
*s
);
121 sd_event
*sd_event_source_get_event(sd_event_source
*s
);
122 void* sd_event_source_get_userdata(sd_event_source
*s
);
123 void* sd_event_source_set_userdata(sd_event_source
*s
, void *userdata
);
125 int sd_event_source_set_description(sd_event_source
*s
, const char *description
);
126 int sd_event_source_get_description(sd_event_source
*s
, const char **description
);
127 int sd_event_source_set_prepare(sd_event_source
*s
, sd_event_handler_t callback
);
128 int sd_event_source_get_pending(sd_event_source
*s
);
129 int sd_event_source_get_priority(sd_event_source
*s
, int64_t *priority
);
130 int sd_event_source_set_priority(sd_event_source
*s
, int64_t priority
);
131 int sd_event_source_get_enabled(sd_event_source
*s
, int *enabled
);
132 int sd_event_source_set_enabled(sd_event_source
*s
, int enabled
);
133 int sd_event_source_get_io_fd(sd_event_source
*s
);
134 int sd_event_source_set_io_fd(sd_event_source
*s
, int fd
);
135 int sd_event_source_get_io_fd_own(sd_event_source
*s
);
136 int sd_event_source_set_io_fd_own(sd_event_source
*s
, int own
);
137 int sd_event_source_get_io_events(sd_event_source
*s
, uint32_t* events
);
138 int sd_event_source_set_io_events(sd_event_source
*s
, uint32_t events
);
139 int sd_event_source_get_io_revents(sd_event_source
*s
, uint32_t* revents
);
140 int sd_event_source_get_time(sd_event_source
*s
, uint64_t *usec
);
141 int sd_event_source_set_time(sd_event_source
*s
, uint64_t usec
);
142 int sd_event_source_set_time_relative(sd_event_source
*s
, uint64_t usec
);
143 int sd_event_source_get_time_accuracy(sd_event_source
*s
, uint64_t *usec
);
144 int sd_event_source_set_time_accuracy(sd_event_source
*s
, uint64_t usec
);
145 int sd_event_source_get_time_clock(sd_event_source
*s
, clockid_t
*clock
);
146 int sd_event_source_get_signal(sd_event_source
*s
);
147 int sd_event_source_get_child_pid(sd_event_source
*s
, pid_t
*pid
);
148 int sd_event_source_get_child_pidfd(sd_event_source
*s
);
149 int sd_event_source_get_child_pidfd_own(sd_event_source
*s
);
150 int sd_event_source_set_child_pidfd_own(sd_event_source
*s
, int own
);
151 int sd_event_source_get_child_process_own(sd_event_source
*s
);
152 int sd_event_source_set_child_process_own(sd_event_source
*s
, int own
);
153 #if defined _GNU_SOURCE || (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L)
154 int sd_event_source_send_child_signal(sd_event_source
*s
, int sig
, const siginfo_t
*si
, unsigned flags
);
156 int sd_event_source_send_child_signal(sd_event_source
*s
, int sig
, const void *si
, unsigned flags
);
158 int sd_event_source_get_inotify_mask(sd_event_source
*s
, uint32_t *ret
);
159 int sd_event_source_set_destroy_callback(sd_event_source
*s
, sd_event_destroy_t callback
);
160 int sd_event_source_get_destroy_callback(sd_event_source
*s
, sd_event_destroy_t
*ret
);
161 int sd_event_source_get_floating(sd_event_source
*s
);
162 int sd_event_source_set_floating(sd_event_source
*s
, int b
);
164 /* Define helpers so that __attribute__((cleanup(sd_event_unrefp))) and similar may be used. */
165 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event
, sd_event_unref
);
166 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source
, sd_event_source_unref
);
167 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source
, sd_event_source_disable_unref
);
169 _SD_END_DECLARATIONS
;