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) {
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;
}
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;
}
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;
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;
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) {
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;
}
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;
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;
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
}
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) {
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) {
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;
}
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;
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;
}
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;
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;
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) {
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;
}
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;
}
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;
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;
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,
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, ...) \