chiark / gitweb /
service: make sure the watchdog timer is not restarted while stopping
authorMichael Olbrich <m.olbrich@pengutronix.de>
Wed, 23 Jan 2013 13:12:16 +0000 (14:12 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 25 Jan 2013 00:36:47 +0000 (19:36 -0500)
A watchdog notification may be handled after the watchdog timer was stopped
while stopping the service. As a result the timer is restarted and the
service may be restarted as well.
The watchdog timestamp is initially set during startup in
service_enter_start_post() and cleared when the timer is stopped. Therefore
it can be used as an indication if the timer should be reset.

src/core/service.c

index 593946e..baddc5a 100644 (file)
@@ -3400,7 +3400,8 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) {
         if (strv_find(tags, "WATCHDOG=1")) {
                 log_debug_unit(u->id,
                                "%s: got WATCHDOG=1", u->id);
-                service_reset_watchdog(s);
+                if (dual_timestamp_is_set(&s->watchdog_timestamp))
+                        service_reset_watchdog(s);
         }
 
         /* Notify clients about changed status or main pid */