diff options
Diffstat (limited to 'softoff')
-rw-r--r-- | softoff/Makefile.am | 4 | ||||
-rw-r--r-- | softoff/test/Makefile.am | 2 | ||||
-rw-r--r-- | softoff/timer.cpp | 108 | ||||
-rw-r--r-- | softoff/timer.hpp | 100 |
4 files changed, 4 insertions, 210 deletions
diff --git a/softoff/Makefile.am b/softoff/Makefile.am index 35734d2..b7f4c92 100644 --- a/softoff/Makefile.am +++ b/softoff/Makefile.am @@ -2,9 +2,11 @@ AM_DEFAULT_SOURCE_EXT = .cpp AM_CPPFLAGS = -I$(top_srcdir) sbin_PROGRAMS = phosphor-softpoweroff +# Using ../ instead of $(top_srcdir) due to automake bug in version 1.15. +# https://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928 phosphor_softpoweroff_SOURCES = \ softoff.cpp \ - timer.cpp \ + ../timer.cpp \ mainapp.cpp \ xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.cpp diff --git a/softoff/test/Makefile.am b/softoff/test/Makefile.am index 2c65568..afdb620 100644 --- a/softoff/test/Makefile.am +++ b/softoff/test/Makefile.am @@ -9,4 +9,4 @@ utest_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS) utest_CXXFLAGS = $(PTHREAD_CFLAGS) utest_LDFLAGS = -lgtest_main -lgtest $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS) $(SYSTEMD_LIBS) ${SDBUSPLUS_LIBS} utest_SOURCES = utest.cpp -utest_LDADD = $(top_builddir)/softoff/timer.o +utest_LDADD = $(top_builddir)/timer.o diff --git a/softoff/timer.cpp b/softoff/timer.cpp deleted file mode 100644 index 4e8fd9a..0000000 --- a/softoff/timer.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include <chrono> -#include <phosphor-logging/log.hpp> -#include "timer.hpp" -namespace phosphor -{ -namespace ipmi -{ - -using namespace phosphor::logging; - -// Initializes the timer object -void Timer::initialize() -{ - // This can not be called more than once. - if (eventSource) - { - throw std::runtime_error("Timer already initialized"); - } - - // Add infinite expiration time - auto r = sd_event_add_time(timeEvent, &eventSource, - CLOCK_MONOTONIC, // Time base - UINT64_MAX, // Expire time - way long time - 0, // Use default event accuracy - timeoutHandler, // Callback handler on timeout - this); // User data - if (r < 0) - { - log<level::ERR>("Failure to set initial expiration time value", - entry("ERROR=%s", strerror(-r))); - - throw std::runtime_error("Timer initialization failed"); - } - - // Disable the timer for now - r = setTimer(SD_EVENT_OFF); - if (r < 0) - { - log<level::ERR>("Failure to disable timer", - entry("ERROR=%s", strerror(-r))); - - throw std::runtime_error("Disabling the timer failed"); - } - return; -} - -/** @brief callback handler on timeout */ -int Timer::timeoutHandler(sd_event_source* eventSource, - uint64_t usec, void* userData) -{ - auto timer = static_cast<Timer*>(userData); - timer->expired = true; - - // Call optional user call back function if available - if(timer->userCallBack) - { - timer->userCallBack(); - } - - log<level::INFO>("Timer expired"); - return 0; -} - -// Gets the time from steady_clock -std::chrono::microseconds Timer::getTime() -{ - using namespace std::chrono; - auto usec = steady_clock::now().time_since_epoch(); - return duration_cast<microseconds>(usec); -} - -// Enables or disables the timer -int Timer::setTimer(int action) -{ - return sd_event_source_set_enabled(eventSource, action); -} - -// Sets the time and arms the timer -int Timer::startTimer(std::chrono::microseconds timeValue) -{ - // Disable the timer - setTimer(SD_EVENT_OFF); - - // Get the current MONOTONIC time and add the delta - auto expireTime = getTime() + timeValue; - - // Set the time - auto r = sd_event_source_set_time(eventSource, expireTime.count()); - if (r < 0) - { - log<level::ERR>("Failure to set timer", - entry("ERROR=%s", strerror(-r))); - return r; - } - - // A ONESHOT timer means that when the timer goes off, - // its moves to disabled state. - r = setTimer(SD_EVENT_ONESHOT); - if (r < 0) - { - log<level::ERR>("Failure to start timer", - entry("ERROR=%s", strerror(-r))); - } - return r; -} - -} // namespace ipmi -} // namespace phosphor diff --git a/softoff/timer.hpp b/softoff/timer.hpp deleted file mode 100644 index cbd3444..0000000 --- a/softoff/timer.hpp +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once - -#include <functional> -#include <systemd/sd-event.h> -namespace phosphor -{ -namespace ipmi -{ - -/** @class Timer - * @brief Manages starting watchdog timers and handling timeouts - */ -class Timer -{ - public: - /** @brief Only need the default Timer */ - Timer() = delete; - Timer(const Timer&) = delete; - Timer& operator=(const Timer&) = delete; - Timer(Timer&&) = delete; - Timer& operator=(Timer&&) = delete; - - /** @brief Constructs timer object - * - * @param[in] events - sd_event pointer - * @param[in] funcCallBack - optional function callback for timer - * expirations - */ - Timer(sd_event* events, - std::function<void()> userCallBack = nullptr) - : timeEvent(events), userCallBack(userCallBack) - { - // Initialize the timer - initialize(); - } - - ~Timer() - { - if (eventSource) - { - eventSource = sd_event_source_unref(eventSource); - } - } - - inline auto isExpired() const - { - return expired; - } - - /** @brief Starts the timer with specified expiration value. - * input is an offset from the current steady_clock - */ - int startTimer(std::chrono::microseconds usec); - - /** @brief Enables / disables the timer */ - int setTimer(int action); - - private: - /** @brief the sd_event structure */ - sd_event* timeEvent = nullptr; - - /** @brief Source of events */ - sd_event_source* eventSource = nullptr; - - /** @brief Returns if the associated timer is expired - * - * This is set to true when the timeoutHandler is called into - */ - bool expired = false; - - /** @brief Initializes the timer object with infinite - * expiration time and sets up the callback handler - * - * @return None. - * - * @error std::runtime exception thrown - */ - void initialize(); - - /** @brief Callback function when timer goes off - * - * On getting the signal, initiate the hard power off request - * - * @param[in] eventSource - Source of the event - * @param[in] usec - time in micro seconds - * @param[in] userData - User data pointer - * - */ - static int timeoutHandler(sd_event_source* eventSource, - uint64_t usec, void* userData); - - /** @brief Gets the current time from steady clock */ - static std::chrono::microseconds getTime(); - - /** @brief Optional function to call on timer expiration */ - std::function<void()> userCallBack; -}; - -} // namespace ipmi -} // namespace phosphor |