return 0;
}
+static int service_cgroup_freezer_action(Unit *u, FreezerAction action) {
+ Service *s = ASSERT_PTR(SERVICE(u));
+ int r;
+
+ r = unit_cgroup_freezer_action(u, action);
+ if (r <= 0)
+ return r;
+
+ if (action == FREEZER_FREEZE)
+ service_stop_watchdog(s);
+ else if (action == FREEZER_THAW)
+ service_reset_watchdog(s);
+
+ return r;
+}
+
static const char* const service_restart_table[_SERVICE_RESTART_MAX] = {
[SERVICE_RESTART_NO] = "no",
[SERVICE_RESTART_ON_SUCCESS] = "on-success",
.live_mount = service_live_mount,
.can_live_mount = service_can_live_mount,
- .freezer_action = unit_cgroup_freezer_action,
+ .freezer_action = service_cgroup_freezer_action,
.serialize = service_serialize,
.deserialize_item = service_deserialize_item,
echo
}
+testcase_watchdog() {
+ local unit="wd.service"
+
+ systemd-run --collect --unit "$unit" --property WatchdogSec=4s --property Type=notify \
+ /bin/bash -c 'systemd-notify --ready; while true; do systemd-notify WATCHDOG=1; sleep 1; done'
+
+ systemctl freeze "$unit"
+
+ check_freezer_state "$unit" "frozen"
+ sleep 6
+ check_freezer_state "$unit" "frozen"
+
+ systemctl thaw "$unit"
+ sleep 6
+ check_freezer_state "$unit" "running"
+ systemctl is-active "$unit"
+
+ systemctl stop "$unit"
+}
+
if [[ -e /sys/fs/cgroup/system.slice/cgroup.freeze ]]; then
start_test_service
run_testcases