summaryrefslogtreecommitdiff
path: root/src/cam/event_loop.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-10-25 14:40:50 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-11-15 22:21:23 +0200
commit7d35c771c0480e1ca5942ba3c9cf09c1fde22f85 (patch)
tree5de606b9a2a09fa58abf1f063a106b1cc9b4e1a6 /src/cam/event_loop.cpp
parenta27057fc503de6b8e1fb67bfe704dba80b51bfd8 (diff)
cam: Use libevent to implement event loop
To prepare for removal of the EventDispatcher from the libcamera public API, switch to libevent to handle the event loop. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/cam/event_loop.cpp')
-rw-r--r--src/cam/event_loop.cpp34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
index e8ab8617..13f2583d 100644
--- a/src/cam/event_loop.cpp
+++ b/src/cam/event_loop.cpp
@@ -5,19 +5,34 @@
* event_loop.cpp - cam - Event loop
*/
-#include <libcamera/event_dispatcher.h>
-
#include "event_loop.h"
-using namespace libcamera;
+#include <assert.h>
+#include <event2/event.h>
+#include <event2/thread.h>
+
+EventLoop *EventLoop::instance_ = nullptr;
-EventLoop::EventLoop(EventDispatcher *dispatcher)
- : dispatcher_(dispatcher)
+EventLoop::EventLoop()
{
+ assert(!instance_);
+
+ evthread_use_pthreads();
+ event_ = event_base_new();
+ instance_ = this;
}
EventLoop::~EventLoop()
{
+ instance_ = nullptr;
+
+ event_base_free(event_);
+ libevent_global_shutdown();
+}
+
+EventLoop *EventLoop::instance()
+{
+ return instance_;
}
int EventLoop::exec()
@@ -26,7 +41,7 @@ int EventLoop::exec()
exit_.store(false, std::memory_order_release);
while (!exit_.load(std::memory_order_acquire))
- dispatcher_->processEvents();
+ event_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);
return exitCode_;
}
@@ -35,5 +50,10 @@ void EventLoop::exit(int code)
{
exitCode_ = code;
exit_.store(true, std::memory_order_release);
- dispatcher_->interrupt();
+ interrupt();
+}
+
+void EventLoop::interrupt()
+{
+ event_base_loopbreak(event_);
}