diff options
author | Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com> | 2017-02-01 18:02:38 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-03-27 13:27:01 -0500 |
commit | d27e71e23cbe02dad145419c46c064d212420836 (patch) | |
tree | cc8743ab9bc4f69b0d0a7908e7a74c2a06feb351 /softoff/timer.cpp | |
parent | 072482986dfa60a905392c2dc49031ad7296bf2a (diff) | |
download | phosphor-host-ipmid-d27e71e23cbe02dad145419c46c064d212420836.tar.gz phosphor-host-ipmid-d27e71e23cbe02dad145419c46c064d212420836.zip |
Add routines to start and stop the sd_event timer
Change-Id: I738be7b70554125e544aa59fe1770e909d3dffb1
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
Diffstat (limited to 'softoff/timer.cpp')
-rw-r--r-- | softoff/timer.cpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/softoff/timer.cpp b/softoff/timer.cpp index 9e722f1..c626536 100644 --- a/softoff/timer.cpp +++ b/softoff/timer.cpp @@ -1,3 +1,4 @@ +#include <chrono> #include <phosphor-logging/log.hpp> #include "timer.hpp" namespace phosphor @@ -19,7 +20,7 @@ void Timer::initialize() // Add infinite expiration time auto r = sd_event_add_time(timeEvent, &eventSource, CLOCK_MONOTONIC, // Time base - UINT64_MAX, // Expire time - way long enough time + UINT64_MAX, // Expire time - way long time 0, // Use default event accuracy timeoutHandler, // Callback handler on timeout this); // User data @@ -32,13 +33,13 @@ void Timer::initialize() } // Disable the timer for now - r = sd_event_source_set_enabled(eventSource, SD_EVENT_OFF); + r = setTimer(SD_EVENT_OFF); if (r < 0) { log<level::ERR>("Failure to disable timer", entry("ERROR=%s", strerror(-r))); - throw std::runtime_error("Setting initial timer value failed"); + throw std::runtime_error("Disabling the timer failed"); } return; } @@ -54,5 +55,48 @@ int Timer::timeoutHandler(sd_event_source* eventSource, 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 |