#include #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 enough time 0, // Use default event accuracy timeoutHandler, // Callback handler on timeout this); // User data if (r < 0) { log("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 = sd_event_source_set_enabled(eventSource, SD_EVENT_OFF); if (r < 0) { log("Failure to disable timer", entry("ERROR=%s", strerror(-r))); throw std::runtime_error("Setting initial timer value failed"); } return; } /** @brief callback handler on timeout */ int Timer::timeoutHandler(sd_event_source* eventSource, uint64_t usec, void* userData) { auto timer = static_cast(userData); timer->expired = true; log("Timer expired"); return 0; } } // namespace ipmi } // namespace phosphor