Invoke optional callback function on timer expiration
When the timer expires, it calls into it's own timeout
handler which matches with sd_event callback handler.
However, it is beneficial if the users of timer register
their own callback routine so that they can execute some
operations on timeout.
Change-Id: Ia88cb4e3c17f6dd8d4528fa193ec7927f083a92b
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/timer.cpp b/timer.cpp
index bf1a470..c98dcb0 100644
--- a/timer.cpp
+++ b/timer.cpp
@@ -44,12 +44,16 @@
{
using namespace phosphor::logging;
+ log<level::INFO>("Timer Expired");
+
auto timer = static_cast<Timer*>(userData);
timer->expire = true;
- log<level::INFO>("Timer Expired");
-
- //TODO: Need to call user callback function.
+ // Call an optional callback function
+ if(timer->userCallBack)
+ {
+ timer->userCallBack();
+ }
return 0;
}
diff --git a/timer.hpp b/timer.hpp
index 49580d7..2ade017 100644
--- a/timer.hpp
+++ b/timer.hpp
@@ -43,10 +43,14 @@
/** @brief Constructs timer object
*
- * @param[in] event - sd_event unique pointer reference
+ * @param[in] event - sd_event unique pointer
+ * @param[in] userCallBack - Optional function callback
+ * for timer expiration
*/
- Timer(EventPtr& event)
- : event(event)
+ Timer(EventPtr& event,
+ std::function<void()> userCallBack = nullptr)
+ : event(event),
+ userCallBack(userCallBack)
{
// Initialize the timer
initialize();
@@ -100,6 +104,11 @@
/** @brief Set to true when the timeoutHandler is called into */
bool expire = false;
+ /** @brief Optional function to call on timer expiration
+ * This is called from timeout handler.
+ */
+ std::function<void()> userCallBack;
+
/** @brief Initializes the timer object with infinite
* expiration time and sets up the callback handler
*
diff --git a/watchdog.cpp b/watchdog.cpp
index c9e9919..e5e8aff 100644
--- a/watchdog.cpp
+++ b/watchdog.cpp
@@ -1,7 +1,6 @@
#include <chrono>
#include <phosphor-logging/log.hpp>
#include "watchdog.hpp"
-
namespace phosphor
{
namespace watchdog
@@ -92,5 +91,13 @@
return 0;
}
+// Optional callback function on timer expiration
+void Watchdog::timeOutHandler()
+{
+ log<level::INFO>("Optional callback called");
+ // TODO: Need to call the user passed systemd
+ // target on this condition
+}
+
} // namespace watchdog
} // namepsace phosphor
diff --git a/watchdog.hpp b/watchdog.hpp
index 47484af..1a7a410 100644
--- a/watchdog.hpp
+++ b/watchdog.hpp
@@ -5,7 +5,6 @@
#include <sdbusplus/server/object.hpp>
#include <xyz/openbmc_project/State/Watchdog/server.hpp>
#include "timer.hpp"
-
namespace phosphor
{
namespace watchdog
@@ -39,7 +38,7 @@
EventPtr& event) :
WatchdogInherits(bus, objPath),
bus(bus),
- timer(event)
+ timer(event, std::bind(&Watchdog::timeOutHandler, this))
{
// Nothing
}
@@ -86,6 +85,9 @@
/** @brief Contained timer object */
Timer timer;
+
+ /** @brief Optional Callback handler on timer expirartion */
+ void timeOutHandler();
};
} // namespace watchdog