[RFC PATCH 6/6] Support systemd watchdog

Victor Westerhuis victor@westerhu.is
Sun Mar 7 12:49:58 GMT 2021


Signed-off-by: Victor Westerhuis <victor@westerhu.is>
---
 debuginfod/debuginfod.cxx | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx
index 35b5fc18..b31c77d3 100644
--- a/debuginfod/debuginfod.cxx
+++ b/debuginfod/debuginfod.cxx
@@ -94,6 +94,7 @@ using namespace std;
 #include <microhttpd.h>
 
 #ifdef ENABLE_SYSTEMD
+#include <time.h>
 #include <systemd/sd-daemon.h>
 #endif
 
@@ -3600,13 +3601,43 @@ main (int argc, char *argv[])
         }
     }
 
+#ifdef ENABLE_SYSTEMD
+  uint64_t timeout_usec;
+  int watchdog_enabled = sd_watchdog_enabled (true, &timeout_usec);
+  if (watchdog_enabled < 0)
+    report_error (0, -watchdog_enabled,
+                  "warning: cannot determine if watchdog is enabled");
+#endif
+
   /* Trivial main loop! */
 #ifdef ENABLE_SYSTEMD
   (void) sd_notify (false, "READY=1");
 #endif
   set_metric("ready", 1);
-  while (! interrupted)
-    pause ();
+#ifdef ENABLE_SYSTEMD
+  if (watchdog_enabled > 0)
+    {
+      timeout_usec /= 2;
+      struct timespec timeout;
+      timeout.tv_sec = timeout_usec / 1000000;
+      timeout.tv_nsec = timeout_usec % 1000000 * 1000;
+
+      rc = 0;
+      struct timespec remaining_timeout;
+      while (! interrupted)
+        {
+          if (rc == 0)
+            {
+              (void) sd_notify (false, "WATCHDOG=1");
+              remaining_timeout = timeout;
+            }
+          rc = nanosleep (&remaining_timeout, &remaining_timeout);
+        }
+    }
+  else
+#endif
+    while (! interrupted)
+      pause ();
   scanq.nuke(); // wake up any remaining scanq-related threads, let them die
   set_metric("ready", 0);
 #ifdef ENABLE_SYSTEMD
-- 
2.30.1


More information about the Elfutils-devel mailing list