diff options
author | Nagaraju Goruganti <ngorugan@in.ibm.com> | 2018-04-06 06:15:27 -0500 |
---|---|---|
committer | Nagaraju Goruganti <ngorugan@in.ibm.com> | 2018-05-03 00:22:14 -0500 |
commit | 41a774efacb3f3a9593aeaa971468e770d205e13 (patch) | |
tree | 4a839e10cdcaae40aed7b7901b85e8c37ab14a81 /timer.hpp | |
parent | 969b2613fed44f5b504411b21a9c65d89ed28bf5 (diff) | |
download | phosphor-state-manager-41a774efacb3f3a9593aeaa971468e770d205e13.tar.gz phosphor-state-manager-41a774efacb3f3a9593aeaa971468e770d205e13.zip |
Add Timer class
The class provides for a timer, callback invocation on timer expiry, and
timer control/cleanup. This will be used in subsequent commits.
Change-Id: Ic8f43264a47903732b590a360ef0d8af765d5a20
Signed-off-by: Nagaraju Goruganti <ngorugan@in.ibm.com>
Diffstat (limited to 'timer.hpp')
-rw-r--r-- | timer.hpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/timer.hpp b/timer.hpp new file mode 100644 index 0000000..f5f9ada --- /dev/null +++ b/timer.hpp @@ -0,0 +1,112 @@ +#pragma once + +#include <memory> +#include <chrono> +#include <functional> +#include <systemd/sd-event.h> + +namespace phosphor +{ +namespace state +{ +namespace manager +{ +namespace timer +{ + +enum Action +{ + OFF = SD_EVENT_OFF, + ON = SD_EVENT_ON, + ONESHOT = SD_EVENT_ONESHOT +}; +} // namespace timer + +/* Need a custom deleter for freeing up sd_event */ +struct EventDeleter +{ + void operator()(sd_event* event) const + { + event = sd_event_unref(event); + } +}; +using EventPtr = std::unique_ptr<sd_event, EventDeleter>; + +/* Need a custom deleter for freeing up sd_event_source */ +struct EventSourceDeleter +{ + void operator()(sd_event_source* eventSource) const + { + eventSource = sd_event_source_unref(eventSource); + } +}; +using EventSourcePtr = std::unique_ptr<sd_event_source, EventSourceDeleter>; + +/** @class Timer + * @brief Provides a timer source and a mechanism to callback when the timer + * expires. + * + * The timer is armed upon construction. The constructor requires a timeout + * handler function, the timer expiry duration, and the timer state (one-shot, + * reptitive, disabled). + * It's possible to change the state of the timer after it's been armed via the + * state() API. + */ +class Timer +{ + public: + 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] callback - function callback for timer expiry + * @param[in] usec - timer duration, in micro seconds + * @param[in] action - controls the timer's lifetime + */ + Timer(EventPtr& event, std::function<void()> userCallback, + std::chrono::microseconds usec, timer::Action action); + + /** @brief Enables / disables the timer + * @param[in] action - controls the timer's lifetime + */ + int state(timer::Action value); + + timer::Action getAction() const; + + std::chrono::microseconds getDuration() const; + + private: + /** @brief Reference to sd_event unique pointer */ + EventPtr& event_; + + /** @brief Source of events */ + EventSourcePtr eventSource_; + + /** @brief Optional function to call on timer expiration */ + std::function<void()> callback_{}; + + /** @brief Duration of the timer */ + std::chrono::microseconds duration_{}; + + /** @brief whether the timer is enabled/disabled/one-shot */ + timer::Action action_ = timer::OFF; + + /** @brief Timer expiry handler - invokes callback + * + * @param[in] eventSource - Source of the event + * @param[in] usec - time in micro seconds + * @param[in] userData - User data pointer + * + * @return zero on success, non-zero otherwise + */ + static int timeoutHandler(sd_event_source* eventSource, uint64_t usec, + void* userData); +}; +} // namespace manager +} // namespace state +} // namespace phosphor |