diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-10-25 14:40:50 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-11-15 22:21:23 +0200 |
commit | 7d35c771c0480e1ca5942ba3c9cf09c1fde22f85 (patch) | |
tree | 5de606b9a2a09fa58abf1f063a106b1cc9b4e1a6 /src/cam/event_loop.cpp | |
parent | a27057fc503de6b8e1fb67bfe704dba80b51bfd8 (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.cpp | 34 |
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_); } |