core: generalize service_arm_timer() for all unit types
This commit is contained in:
+6
-30
@@ -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;
|
||||
|
||||
+6
-30
@@ -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
|
||||
|
||||
+1
-25
@@ -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) {
|
||||
|
||||
+7
-31
@@ -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;
|
||||
|
||||
+6
-30
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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, ...) \
|
||||
|
||||
Reference in New Issue
Block a user