summaryrefslogtreecommitdiff
path: root/src/cam
diff options
context:
space:
mode:
authorEric Curtin <ecurtin@redhat.com>2022-05-20 20:01:04 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-05-23 12:49:41 +0300
commita5844adb7b6b564f77fb15ec0716ac85bcb1bc42 (patch)
tree32e454ee7f199d67d4bdaf967f4411c597b422a1 /src/cam
parent48e991476d73da73d8ef145074eb1ffd4cad6c16 (diff)
cam: event_loop: Add timer events to event loop
Extend the EventLoop class to support periodic timer events. This can be used to run tasks periodically, such as handling the event loop of SDL. Signed-off-by: Eric Curtin <ecurtin@redhat.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Tested-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/cam')
-rw-r--r--src/cam/event_loop.cpp24
-rw-r--r--src/cam/event_loop.h7
2 files changed, 30 insertions, 1 deletions
diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
index 2e3ce995..cb83845c 100644
--- a/src/cam/event_loop.cpp
+++ b/src/cam/event_loop.cpp
@@ -84,6 +84,30 @@ void EventLoop::addFdEvent(int fd, EventType type,
events_.push_back(std::move(event));
}
+void EventLoop::addTimerEvent(const std::chrono::microseconds period,
+ const std::function<void()> &callback)
+{
+ std::unique_ptr<Event> event = std::make_unique<Event>(callback);
+ event->event_ = event_new(base_, -1, EV_PERSIST, &EventLoop::Event::dispatch,
+ event.get());
+ if (!event->event_) {
+ std::cerr << "Failed to create timer event" << std::endl;
+ return;
+ }
+
+ struct timeval tv;
+ tv.tv_sec = period.count() / 1000000ULL;
+ tv.tv_usec = period.count() % 1000000ULL;
+
+ int ret = event_add(event->event_, &tv);
+ if (ret < 0) {
+ std::cerr << "Failed to add timer event" << std::endl;
+ return;
+ }
+
+ events_.push_back(std::move(event));
+}
+
void EventLoop::dispatchCallback([[maybe_unused]] evutil_socket_t fd,
[[maybe_unused]] short flags, void *param)
{
diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h
index 79902d87..ef79e8e5 100644
--- a/src/cam/event_loop.h
+++ b/src/cam/event_loop.h
@@ -7,9 +7,10 @@
#pragma once
+#include <chrono>
#include <functional>
-#include <memory>
#include <list>
+#include <memory>
#include <mutex>
#include <event2/util.h>
@@ -37,6 +38,10 @@ public:
void addFdEvent(int fd, EventType type,
const std::function<void()> &handler);
+ using duration = std::chrono::steady_clock::duration;
+ void addTimerEvent(const std::chrono::microseconds period,
+ const std::function<void()> &handler);
+
private:
struct Event {
Event(const std::function<void()> &callback);