diff options
Diffstat (limited to 'AudioManagerUtilities/src/CAmWatchdog.cpp')
-rwxr-xr-x | AudioManagerUtilities/src/CAmWatchdog.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/AudioManagerUtilities/src/CAmWatchdog.cpp b/AudioManagerUtilities/src/CAmWatchdog.cpp new file mode 100755 index 0000000..db65095 --- /dev/null +++ b/AudioManagerUtilities/src/CAmWatchdog.cpp @@ -0,0 +1,113 @@ +/** + * SPDX license identifier: MPL-2.0 + * + * 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 Linke, christian.linke@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 "audiomanagerconfig.h" +#include "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 = 0; + + char* wusec=getenv("WATCHDOG_USEC"); + if (wusec) + watchdogTimeout=atoi(wusec); + + if (watchdogTimeout > 0) + { + timespec timeout; + + //calculate the half cycle as the right interval to trigger the watchdog. + timeout.tv_sec = (watchdogTimeout / 2) / 1000000; + timeout.tv_nsec = ((watchdogTimeout / 2) % 1000000) * 1000; + logInfo("CAmWatchdog::CAmWatchdog setting watchdog timeout:", watchdogTimeout, "us. Notification set to:", + timeout.tv_sec, "sec and", timeout.tv_nsec, "ns"); + + //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. + if (mHandle!=0) + 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); +} + +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 */ |