summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon/src/CAmWatchdog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AudioManagerDaemon/src/CAmWatchdog.cpp')
-rwxr-xr-xAudioManagerDaemon/src/CAmWatchdog.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/AudioManagerDaemon/src/CAmWatchdog.cpp b/AudioManagerDaemon/src/CAmWatchdog.cpp
new file mode 100755
index 0000000..61e0624
--- /dev/null
+++ b/AudioManagerDaemon/src/CAmWatchdog.cpp
@@ -0,0 +1,104 @@
+/**
+ * Copyright (C) 2012, BMW AG
+ *
+ * This file is part of GENIVI Project AudioManager.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ *
+ * \author Christian Mueller, christian.ei.mueller@bmw.de BMW 2011,2012
+ *
+ * \file CAmWatchdog.cpp
+ * For further information see http://www.genivi.org/.
+ *
+ */
+
+#include "CAmWatchdog.h"
+#include <cassert>
+#include <cstdlib>
+#include <stdexcept>
+#include "config.h"
+#include "shared/CAmDltWrapper.h"
+
+#ifdef SYSTEMD_FOUND
+ #include <systemd/sd-daemon.h>
+#else
+ #include "sd-daemon.h"
+#endif
+
+namespace am
+{
+
+CAmWatchdog::CAmWatchdog(CAmSocketHandler* CAmSocketHandler) :
+ TimerCallback(this, &CAmWatchdog::timerCallback), //
+ mpCAmSocketHandler(CAmSocketHandler), //
+ mHandle(0) //
+{
+ assert(mpCAmSocketHandler);
+
+ //first retrieve the timeout interval
+ int watchdogTimeout = atoi(getenv("WATCHDOG_USEC"));
+
+ if (watchdogTimeout > 0)
+ {
+ timespec timeout;
+ logInfo("CAmWatchdog::CAmWatchdog setting watchdog timeout to ", watchdogTimeout, " museconds");
+
+ //calulate the half cycle as the right interval to trigger the watchdog.
+ timeout.tv_sec = watchdogTimeout / 2000000;
+ timeout.tv_nsec = (watchdogTimeout % 1000000) * 500;
+
+ //add the timer here
+ if (mpCAmSocketHandler->addTimer(timeout, &TimerCallback, mHandle, NULL))
+ {
+ logError("CAmWatchdog::CAmWatchdog failed to add timer");
+ throw std::runtime_error("CAmWatchdog::CAmWatchdog failed to add timer");
+ }
+ }
+
+ else
+ {
+ logInfo("CAmWatchdog::CAmWatchdog watchdog timeout was ", watchdogTimeout, " museconds, no watchdog active");
+ }
+}
+
+CAmWatchdog::~CAmWatchdog()
+{
+ //remove the timer again.
+ mpCAmSocketHandler->removeTimer(mHandle);
+}
+
+void CAmWatchdog::timerCallback(sh_timerHandle_t handle, void* userData)
+{
+ (void) userData;
+ int error(sd_notify(0, "WATCHDOG=1"));
+ if (error < 0)
+ {
+ logError("CAmWatchdog::timerCallback could not reset watchdog, error ", error);
+ throw std::runtime_error("CAmWatchdog::timerCallback could not reset watchdog");
+ }
+
+ mpCAmSocketHandler->restartTimer(handle);
+ logInfo("restarted watchdog ");
+}
+
+void CAmWatchdog::startWatchdog()
+{
+ int error(sd_notify(0, "READY=1"));
+ if (error < 0)
+ {
+ logError("CAmWatchdog::startWatchdog could not start watchdog, error ", error);
+ throw std::runtime_error("CAmWatchdog::startWatchdog could not start watchdog");
+ }
+ logInfo("READY=1 was sent to systemd");
+}
+
+}
+
+/* namespace am */