|
|
b11b5f |
From 30f5836253f820086caa24fc9283344615b8fc00 Mon Sep 17 00:00:00 2001
|
|
|
b11b5f |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
b11b5f |
Date: Tue, 28 Jul 2020 11:17:00 +0200
|
|
|
b11b5f |
Subject: [PATCH] sd-event: add relative timer calls
|
|
|
b11b5f |
|
|
|
b11b5f |
We frequently want to set a timer relative to the current time. Let's
|
|
|
b11b5f |
add an explicit API for this. This not only saves us a few lines of code
|
|
|
b11b5f |
everywhere and simplifies things, but also allows us to do correct
|
|
|
b11b5f |
overflow checking.
|
|
|
b11b5f |
|
|
|
b11b5f |
(cherry picked from commit d6a83dc48ad1981665ff427858ae8e59d4cfd6cb)
|
|
|
b11b5f |
|
|
|
b11b5f |
Related: #2122288
|
|
|
b11b5f |
---
|
|
|
b11b5f |
src/libsystemd/libsystemd.sym | 8 +++++-
|
|
|
b11b5f |
src/libsystemd/sd-event/sd-event.c | 42 ++++++++++++++++++++++++++++++
|
|
|
b11b5f |
src/systemd/sd-event.h | 2 ++
|
|
|
b11b5f |
3 files changed, 51 insertions(+), 1 deletion(-)
|
|
|
b11b5f |
|
|
|
b11b5f |
diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
|
|
|
b11b5f |
index 3b55fc6473..449918093c 100644
|
|
|
b11b5f |
--- a/src/libsystemd/libsystemd.sym
|
|
|
b11b5f |
+++ b/src/libsystemd/libsystemd.sym
|
|
|
b11b5f |
@@ -578,12 +578,18 @@ LIBSYSTEMD_240 {
|
|
|
b11b5f |
sd_bus_get_method_call_timeout;
|
|
|
b11b5f |
} LIBSYSTEMD_239;
|
|
|
b11b5f |
|
|
|
b11b5f |
+LIBSYSTEMD_247 {
|
|
|
b11b5f |
+global:
|
|
|
b11b5f |
+ sd_event_add_time_relative;
|
|
|
b11b5f |
+ sd_event_source_set_time_relative;
|
|
|
b11b5f |
+} LIBSYSTEMD_240;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
LIBSYSTEMD_248 {
|
|
|
b11b5f |
global:
|
|
|
b11b5f |
sd_event_source_set_ratelimit;
|
|
|
b11b5f |
sd_event_source_get_ratelimit;
|
|
|
b11b5f |
sd_event_source_is_ratelimited;
|
|
|
b11b5f |
-} LIBSYSTEMD_240;
|
|
|
b11b5f |
+} LIBSYSTEMD_247;
|
|
|
b11b5f |
|
|
|
b11b5f |
LIBSYSTEMD_250 {
|
|
|
b11b5f |
global:
|
|
|
b11b5f |
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
|
|
|
b11b5f |
index 09d4584bf9..2c9d331bf2 100644
|
|
|
b11b5f |
--- a/src/libsystemd/sd-event/sd-event.c
|
|
|
b11b5f |
+++ b/src/libsystemd/sd-event/sd-event.c
|
|
|
b11b5f |
@@ -1415,6 +1415,31 @@ fail:
|
|
|
b11b5f |
return r;
|
|
|
b11b5f |
}
|
|
|
b11b5f |
|
|
|
b11b5f |
+_public_ int sd_event_add_time_relative(
|
|
|
b11b5f |
+ sd_event *e,
|
|
|
b11b5f |
+ sd_event_source **ret,
|
|
|
b11b5f |
+ clockid_t clock,
|
|
|
b11b5f |
+ uint64_t usec,
|
|
|
b11b5f |
+ uint64_t accuracy,
|
|
|
b11b5f |
+ sd_event_time_handler_t callback,
|
|
|
b11b5f |
+ void *userdata) {
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ usec_t t;
|
|
|
b11b5f |
+ int r;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ /* Same as sd_event_add_time() but operates relative to the event loop's current point in time, and
|
|
|
b11b5f |
+ * checks for overflow. */
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ r = sd_event_now(e, clock, &t);
|
|
|
b11b5f |
+ if (r < 0)
|
|
|
b11b5f |
+ return r;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ if (usec >= USEC_INFINITY - t)
|
|
|
b11b5f |
+ return -EOVERFLOW;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ return sd_event_add_time(e, ret, clock, t + usec, accuracy, callback, userdata);
|
|
|
b11b5f |
+}
|
|
|
b11b5f |
+
|
|
|
b11b5f |
static int signal_exit_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
|
|
|
b11b5f |
assert(s);
|
|
|
b11b5f |
|
|
|
b11b5f |
@@ -2578,6 +2603,23 @@ _public_ int sd_event_source_set_time(sd_event_source *s, uint64_t usec) {
|
|
|
b11b5f |
return 0;
|
|
|
b11b5f |
}
|
|
|
b11b5f |
|
|
|
b11b5f |
+_public_ int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec) {
|
|
|
b11b5f |
+ usec_t t;
|
|
|
b11b5f |
+ int r;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ assert_return(s, -EINVAL);
|
|
|
b11b5f |
+ assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ r = sd_event_now(s->event, event_source_type_to_clock(s->type), &t);
|
|
|
b11b5f |
+ if (r < 0)
|
|
|
b11b5f |
+ return r;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ if (usec >= USEC_INFINITY - t)
|
|
|
b11b5f |
+ return -EOVERFLOW;
|
|
|
b11b5f |
+
|
|
|
b11b5f |
+ return sd_event_source_set_time(s, t + usec);
|
|
|
b11b5f |
+}
|
|
|
b11b5f |
+
|
|
|
b11b5f |
_public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
|
|
|
b11b5f |
assert_return(s, -EINVAL);
|
|
|
b11b5f |
assert_return(usec, -EINVAL);
|
|
|
b11b5f |
diff --git a/src/systemd/sd-event.h b/src/systemd/sd-event.h
|
|
|
b11b5f |
index c2e9c9614d..960bea1ac4 100644
|
|
|
b11b5f |
--- a/src/systemd/sd-event.h
|
|
|
b11b5f |
+++ b/src/systemd/sd-event.h
|
|
|
b11b5f |
@@ -87,6 +87,7 @@ sd_event* sd_event_unref(sd_event *e);
|
|
|
b11b5f |
|
|
|
b11b5f |
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);
|
|
|
b11b5f |
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);
|
|
|
b11b5f |
+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);
|
|
|
b11b5f |
int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
|
|
|
b11b5f |
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);
|
|
|
b11b5f |
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);
|
|
|
b11b5f |
@@ -136,6 +137,7 @@ int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
|
|
|
b11b5f |
int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
|
|
|
b11b5f |
int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
|
|
|
b11b5f |
int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
|
|
|
b11b5f |
+int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec);
|
|
|
b11b5f |
int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
|
|
|
b11b5f |
int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
|
|
|
b11b5f |
int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
|