[libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement event loop
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Nov 13 11:13:59 CET 2020
On 13/11/2020 10:08, Laurent Pinchart wrote:
> On Fri, Nov 13, 2020 at 09:59:02AM +0000, Kieran Bingham wrote:
>> On 13/11/2020 06:38, Laurent Pinchart wrote:
>>> 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 at ideasonboard.com>
>>
>> This is missing an update to the README.rst to update the new package
>> dependencies.
>
> diff --git a/README.rst b/README.rst
> index 5c4b6989f7cf..251291b77c62 100644
> --- a/README.rst
> +++ b/README.rst
> @@ -78,6 +78,9 @@ for documentation: [optional]
> for gstreamer: [optional]
> libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
>
> +for cam: [optional]
> + libevent-dev
> +
Looks good to me ;-)
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> for qcam: [optional]
> qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 qttools5-dev-tools libtiff-dev
>
>> And a small whitespace nit below.
>>
>> With those:
>>
>> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>
>>> ---
>>> src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------
>>> src/cam/event_loop.h | 15 ++++++++-------
>>> src/cam/main.cpp | 16 +++++-----------
>>> src/cam/meson.build | 13 ++++++++++++-
>>> 4 files changed, 52 insertions(+), 26 deletions(-)
>>>
>>> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
>>> index e8ab861790ed..13f2583da0a1 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(EventDispatcher *dispatcher)
>>> - : dispatcher_(dispatcher)
>>> +EventLoop *EventLoop::instance_ = nullptr;
>>> +
>>> +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_);
>>> }
>>> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h
>>> index 581c7cba2fc4..b1c6bd103080 100644
>>> --- a/src/cam/event_loop.h
>>> +++ b/src/cam/event_loop.h
>>> @@ -9,26 +9,27 @@
>>>
>>> #include <atomic>
>>>
>>> -#include <libcamera/event_notifier.h>
>>> -
>>> -namespace libcamera {
>>> -class EventDispatcher;
>>> -}
>>> +struct event_base;
>>>
>>> class EventLoop
>>> {
>>> public:
>>> - EventLoop(libcamera::EventDispatcher *dispatcher);
>>> + EventLoop();
>>> ~EventLoop();
>>>
>>> + static EventLoop *instance();
>>> +
>>> int exec();
>>> void exit(int code = 0);
>>>
>>> private:
>>> - libcamera::EventDispatcher *dispatcher_;
>>> + static EventLoop *instance_;
>>>
>>> + struct event_base *event_;
>>> std::atomic<bool> exit_;
>>> int exitCode_;
>>> +
>>> + void interrupt();
>>> };
>>>
>>> #endif /* __CAM_EVENT_LOOP_H__ */
>>> diff --git a/src/cam/main.cpp b/src/cam/main.cpp
>>> index b3a8d94f5739..e01be63a7058 100644
>>> --- a/src/cam/main.cpp
>>> +++ b/src/cam/main.cpp
>>> @@ -52,7 +52,7 @@ private:
>>> CameraManager *cm_;
>>> std::shared_ptr<Camera> camera_;
>>> std::unique_ptr<libcamera::CameraConfiguration> config_;
>>> - EventLoop *loop_;
>>> + EventLoop loop_;
>>>
>>> bool strictFormats_;
>>> };
>>> @@ -60,7 +60,7 @@ private:
>>> CamApp *CamApp::app_ = nullptr;
>>>
>>> CamApp::CamApp()
>>> - : cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),
>>> + : cm_(nullptr), camera_(nullptr), config_(nullptr),
>>> strictFormats_(false)
>>> {
>>> CamApp::app_ = this;
>>> @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)
>>> std::cout << "Monitoring new hotplug and unplug events" << std::endl;
>>> }
>>>
>>> - loop_ = new EventLoop(cm_->eventDispatcher());
>>> -
>>> return 0;
>>> }
>>>
>>> void CamApp::cleanup()
>>> {
>>> - delete loop_;
>>> - loop_ = nullptr;
>>> -
>>> if (camera_) {
>>> camera_->release();
>>> camera_.reset();
>>> @@ -166,8 +161,7 @@ int CamApp::exec()
>>>
>>> void CamApp::quit()
>>> {
>>> - if (loop_)
>>> - loop_->exit();
>>> + loop_.exit();
>>> }
>>>
>>> int CamApp::parseOptions(int argc, char *argv[])
>>> @@ -366,13 +360,13 @@ int CamApp::run()
>>> }
>>>
>>> if (options_.isSet(OptCapture)) {
>>> - Capture capture(camera_, config_.get(), loop_);
>>> + Capture capture(camera_, config_.get(), &loop_);
>>> return capture.run(options_);
>>> }
>>>
>>> if (options_.isSet(OptMonitor)) {
>>> std::cout << "Press Ctrl-C to interrupt" << std::endl;
>>> - ret = loop_->exec();
>>> + ret = loop_.exec();
>>> if (ret)
>>> std::cout << "Failed to run monitor loop" << std::endl;
>>> }
>>> diff --git a/src/cam/meson.build b/src/cam/meson.build
>>> index 89e124fbae2a..62003c58dad0 100644
>>> --- a/src/cam/meson.build
>>> +++ b/src/cam/meson.build
>>> @@ -1,5 +1,12 @@
>>> # SPDX-License-Identifier: CC0-1.0
>>>
>>> +libevent = dependency('libevent_pthreads', required : false)
>>> +
>>> +if not libevent.found()
>>> + warning('libevent_pthreads not found,\'cam\' application will not be compiled')
>>
>> missing a space after comma,
>>
>>> + subdir_done()
>>> +endif
>>> +
>>> cam_sources = files([
>>> 'buffer_writer.cpp',
>>> 'capture.cpp',
>>> @@ -10,5 +17,9 @@ cam_sources = files([
>>> ])
>>>
>>> cam = executable('cam', cam_sources,
>>> - dependencies : [ libatomic, libcamera_dep ],
>>> + dependencies : [
>>> + libatomic,
>>> + libcamera_dep,
>>> + libevent,
>>> + ],
>>> install : true)
>>>
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list