blob: 500a7aecd5c60c89cf2eeef1158d165eca0809a5 [file] [log] [blame]
#pragma once
#include <systemd/sd-event.h>
#include <chrono>
#include <functional>
namespace phosphor
{
namespace network
{
/** @class Timer
* @brief Usage would be,instantiate the timer with the call back
* and start the timer for the given time.
*/
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] funcCallBack - optional function callback for timer
* expirations
*/
Timer(std::function<void()> userCallBack = nullptr):
userCallBack(userCallBack)
{
// Initialize the timer
initialize();
}
~Timer()
{
if (eventSource)
{
eventSource = sd_event_source_unref(eventSource);
}
if(timeEvent)
{
timeEvent = sd_event_unref(timeEvent);
}
}
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;
bool expired = true;
/** @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
*
* @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 network
} // namespace phosphor