From e92768004ef8627ecede5107d21c8f8c6ca976d0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 20 Sep 2023 17:38:23 +0200 Subject: [PATCH] core: generalize service_arm_timer() for all unit types --- src/core/mount.c | 36 ++++++------------------------------ src/core/scope.c | 36 ++++++------------------------------ src/core/service.c | 26 +------------------------- src/core/socket.c | 38 +++++++------------------------------- src/core/swap.c | 36 ++++++------------------------------ src/core/unit.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/core/unit.h | 2 ++ 7 files changed, 71 insertions(+), 146 deletions(-) diff --git a/src/core/mount.c b/src/core/mount.c index 3e60ab48d85..e7a18d13b79 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -191,34 +191,10 @@ static void mount_init(Unit *u) { u->ignore_on_isolate = true; } -static int mount_arm_timer(Mount *m, usec_t usec) { - int r; - +static int mount_arm_timer(Mount *m, bool relative, usec_t usec) { assert(m); - if (usec == USEC_INFINITY) - return sd_event_source_set_enabled(m->timer_event_source, SD_EVENT_OFF); - - if (m->timer_event_source) { - r = sd_event_source_set_time(m->timer_event_source, usec); - if (r < 0) - return r; - - return sd_event_source_set_enabled(m->timer_event_source, SD_EVENT_ONESHOT); - } - - r = sd_event_add_time( - UNIT(m)->manager->event, - &m->timer_event_source, - CLOCK_MONOTONIC, - usec, 0, - mount_dispatch_timer, m); - if (r < 0) - return r; - - (void) sd_event_source_set_description(m->timer_event_source, "mount-timer"); - - return 0; + return unit_arm_timer(UNIT(m), &m->timer_event_source, relative, usec, mount_dispatch_timer); } static void mount_unwatch_control_pid(Mount *m) { @@ -809,7 +785,7 @@ static int mount_coldplug(Unit *u) { if (r < 0) return r; - r = mount_arm_timer(m, usec_add(u->state_change_timestamp.monotonic, m->timeout_usec)); + r = mount_arm_timer(m, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, m->timeout_usec)); if (r < 0) return r; } @@ -932,7 +908,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, PidRef *ret_pid) { if (r < 0) return r; - r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec)); + r = mount_arm_timer(m, /* relative= */ true, m->timeout_usec); if (r < 0) return r; @@ -1045,7 +1021,7 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) { } if (r > 0) { - r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec)); + r = mount_arm_timer(m, /* relative= */ true, m->timeout_usec); if (r < 0) { log_unit_warning_errno(UNIT(m), r, "Failed to install timer: %m"); goto fail; @@ -2305,7 +2281,7 @@ static int mount_clean(Unit *u, ExecCleanMask mask) { m->control_command = NULL; m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID; - r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->exec_context.timeout_clean_usec)); + r = mount_arm_timer(m, /* relative= */ true, m->exec_context.timeout_clean_usec); if (r < 0) { log_unit_warning_errno(u, r, "Failed to install timer: %m"); goto fail; diff --git a/src/core/scope.c b/src/core/scope.c index 78aa638ed2c..cd6fafe0de2 100644 --- a/src/core/scope.c +++ b/src/core/scope.c @@ -76,34 +76,10 @@ static usec_t scope_running_timeout(Scope *s) { delta); } -static int scope_arm_timer(Scope *s, usec_t usec) { - int r; - +static int scope_arm_timer(Scope *s, bool relative, usec_t usec) { assert(s); - if (s->timer_event_source) { - r = sd_event_source_set_time(s->timer_event_source, usec); - if (r < 0) - return r; - - return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT); - } - - if (usec == USEC_INFINITY) - return 0; - - r = sd_event_add_time( - UNIT(s)->manager->event, - &s->timer_event_source, - CLOCK_MONOTONIC, - usec, 0, - scope_dispatch_timer, s); - if (r < 0) - return r; - - (void) sd_event_source_set_description(s->timer_event_source, "scope-timer"); - - return 0; + return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, scope_dispatch_timer); } static void scope_set_state(Scope *s, ScopeState state) { @@ -260,7 +236,7 @@ static int scope_coldplug(Unit *u) { if (s->deserialized_state == s->state) return 0; - r = scope_arm_timer(s, scope_coldplug_timeout(s)); + r = scope_arm_timer(s, /* relative= */ false, scope_coldplug_timeout(s)); if (r < 0) return r; @@ -355,7 +331,7 @@ static void scope_enter_signal(Scope *s, ScopeState state, ScopeResult f) { } if (r > 0) { - r = scope_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_stop_usec)); + r = scope_arm_timer(s, /* relative= */ true, s->timeout_stop_usec); if (r < 0) { log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m"); goto fail; @@ -381,7 +357,7 @@ static int scope_enter_start_chown(Scope *s) { assert(s); assert(s->user); - r = scope_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), u->manager->defaults.timeout_start_usec)); + r = scope_arm_timer(s, /* relative= */ true, u->manager->defaults.timeout_start_usec); if (r < 0) return r; @@ -464,7 +440,7 @@ static int scope_enter_running(Scope *s) { scope_set_state(s, SCOPE_RUNNING); /* Set the maximum runtime timeout. */ - scope_arm_timer(s, scope_running_timeout(s)); + scope_arm_timer(s, /* relative= */ false, scope_running_timeout(s)); /* On unified we use proper notifications hence we can unwatch the PIDs * we just attached to the scope. This can also be done on legacy as diff --git a/src/core/service.c b/src/core/service.c index f2f6dffc02b..fc2380c5a95 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -620,33 +620,9 @@ static usec_t service_running_timeout(Service *s) { } static int service_arm_timer(Service *s, bool relative, usec_t usec) { - int r; - assert(s); - if (s->timer_event_source) { - r = (relative ? sd_event_source_set_time_relative : sd_event_source_set_time)(s->timer_event_source, usec); - if (r < 0) - return r; - - return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT); - } - - if (usec == USEC_INFINITY) - return 0; - - r = (relative ? sd_event_add_time_relative : sd_event_add_time)( - UNIT(s)->manager->event, - &s->timer_event_source, - CLOCK_MONOTONIC, - usec, 0, - service_dispatch_timer, s); - if (r < 0) - return r; - - (void) sd_event_source_set_description(s->timer_event_source, "service-timer"); - - return 0; + return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, service_dispatch_timer); } static int service_verify(Service *s) { diff --git a/src/core/socket.c b/src/core/socket.c index 715ebcbd89f..03c41b4049a 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -182,34 +182,10 @@ static void socket_done(Unit *u) { s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source); } -static int socket_arm_timer(Socket *s, usec_t usec) { - int r; - +static int socket_arm_timer(Socket *s, bool relative, usec_t usec) { assert(s); - if (s->timer_event_source) { - r = sd_event_source_set_time(s->timer_event_source, usec); - if (r < 0) - return r; - - return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT); - } - - if (usec == USEC_INFINITY) - return 0; - - r = sd_event_add_time( - UNIT(s)->manager->event, - &s->timer_event_source, - CLOCK_MONOTONIC, - usec, 0, - socket_dispatch_timer, s); - if (r < 0) - return r; - - (void) sd_event_source_set_description(s->timer_event_source, "socket-timer"); - - return 0; + return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, socket_dispatch_timer); } static bool have_non_accept_socket(Socket *s) { @@ -1885,7 +1861,7 @@ static int socket_coldplug(Unit *u) { if (r < 0) return r; - r = socket_arm_timer(s, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec)); + r = socket_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec)); if (r < 0) return r; } @@ -1948,7 +1924,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, PidRef *ret_pid) { if (r < 0) return r; - r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec)); + r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec); if (r < 0) return r; @@ -1984,7 +1960,7 @@ static int socket_chown(Socket *s, PidRef *ret_pid) { assert(s); - r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec)); + r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec); if (r < 0) return r; @@ -2129,7 +2105,7 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) { } if (r > 0) { - r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec)); + r = socket_arm_timer(s, /* relative= */ true, s->timeout_usec); if (r < 0) { log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m"); goto fail; @@ -3430,7 +3406,7 @@ static int socket_clean(Unit *u, ExecCleanMask mask) { s->control_command = NULL; s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID; - r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->exec_context.timeout_clean_usec)); + r = socket_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec); if (r < 0) { log_unit_warning_errno(u, r, "Failed to install timer: %m"); goto fail; diff --git a/src/core/swap.c b/src/core/swap.c index 58715b10ef3..e849e33a421 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -181,34 +181,10 @@ static void swap_done(Unit *u) { s->timer_event_source = sd_event_source_disable_unref(s->timer_event_source); } -static int swap_arm_timer(Swap *s, usec_t usec) { - int r; - +static int swap_arm_timer(Swap *s, bool relative, usec_t usec) { assert(s); - if (s->timer_event_source) { - r = sd_event_source_set_time(s->timer_event_source, usec); - if (r < 0) - return r; - - return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT); - } - - if (usec == USEC_INFINITY) - return 0; - - r = sd_event_add_time( - UNIT(s)->manager->event, - &s->timer_event_source, - CLOCK_MONOTONIC, - usec, 0, - swap_dispatch_timer, s); - if (r < 0) - return r; - - (void) sd_event_source_set_description(s->timer_event_source, "swap-timer"); - - return 0; + return unit_arm_timer(UNIT(s), &s->timer_event_source, relative, usec, swap_dispatch_timer); } static SwapParameters* swap_get_parameters(Swap *s) { @@ -588,7 +564,7 @@ static int swap_coldplug(Unit *u) { if (r < 0) return r; - r = swap_arm_timer(s, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec)); + r = swap_arm_timer(s, /* relative= */ false, usec_add(u->state_change_timestamp.monotonic, s->timeout_usec)); if (r < 0) return r; } @@ -675,7 +651,7 @@ static int swap_spawn(Swap *s, ExecCommand *c, PidRef *ret_pid) { if (r < 0) return r; - r = swap_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec)); + r = swap_arm_timer(s, /* relative= */ true, s->timeout_usec); if (r < 0) return r; @@ -776,7 +752,7 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) { } if (r > 0) { - r = swap_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec)); + r = swap_arm_timer(s, /* relative= */ true, s->timeout_usec); if (r < 0) { log_unit_warning_errno(UNIT(s), r, "Failed to install timer: %m"); goto fail; @@ -1549,7 +1525,7 @@ static int swap_clean(Unit *u, ExecCleanMask mask) { s->control_command = NULL; s->control_command_id = _SWAP_EXEC_COMMAND_INVALID; - r = swap_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->exec_context.timeout_clean_usec)); + r = swap_arm_timer(s, /* relative= */ true, s->exec_context.timeout_clean_usec); if (r < 0) { log_unit_warning_errno(u, r, "Failed to install timer: %m"); goto fail; diff --git a/src/core/unit.c b/src/core/unit.c index 5fd66e7b6e0..f6b6d2f499e 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -6233,6 +6233,49 @@ int unit_get_transitive_dependency_set(Unit *u, UnitDependencyAtom atom, Set **r return 0; } +int unit_arm_timer( + Unit *u, + sd_event_source **source, + bool relative, + usec_t usec, + sd_event_time_handler_t handler) { + + int r; + + assert(u); + assert(source); + assert(handler); + + if (*source) { + if (usec == USEC_INFINITY) + return sd_event_source_set_enabled(*source, SD_EVENT_OFF); + + r = (relative ? sd_event_source_set_time_relative : sd_event_source_set_time)(*source, usec); + if (r < 0) + return r; + + return sd_event_source_set_enabled(*source, SD_EVENT_ONESHOT); + } + + if (usec == USEC_INFINITY) + return 0; + + r = (relative ? sd_event_add_time_relative : sd_event_add_time)( + u->manager->event, + source, + CLOCK_MONOTONIC, + usec, 0, + handler, + u); + if (r < 0) + return r; + + const char *d = strjoina(unit_type_to_string(u->type), "-timer"); + (void) sd_event_source_set_description(*source, d); + + return 0; +} + const ActivationDetailsVTable * const activation_details_vtable[_UNIT_TYPE_MAX] = { [UNIT_PATH] = &activation_details_path_vtable, [UNIT_TIMER] = &activation_details_timer_vtable, diff --git a/src/core/unit.h b/src/core/unit.h index f1a80cc8912..808d9c4ceaa 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -1087,6 +1087,8 @@ int unit_thaw_vtable_common(Unit *u); Condition *unit_find_failed_condition(Unit *u); +int unit_arm_timer(Unit *u, sd_event_source **source, bool relative, usec_t usec, sd_event_time_handler_t handler); + /* Macros which append UNIT= or USER_UNIT= to the message */ #define log_unit_full_errno_zerook(unit, level, error, ...) \ -- 2.39.2