[{"id":13697,"web_url":"https://patchwork.libcamera.org/comment/13697/","msgid":"<ec2e9d0f-0c20-7098-d521-71861e568f81@ideasonboard.com>","date":"2020-11-13T09:59:02","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 13/11/2020 06:38, Laurent Pinchart wrote:\n> To prepare for removal of the EventDispatcher from the libcamera public\n> API, switch to libevent to handle the event loop.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nThis is missing an update to the README.rst to update the new package\ndependencies.\n\nAnd a small whitespace nit below.\n\nWith those:\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n> ---\n>  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n>  src/cam/event_loop.h   | 15 ++++++++-------\n>  src/cam/main.cpp       | 16 +++++-----------\n>  src/cam/meson.build    | 13 ++++++++++++-\n>  4 files changed, 52 insertions(+), 26 deletions(-)\n> \n> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n> index e8ab861790ed..13f2583da0a1 100644\n> --- a/src/cam/event_loop.cpp\n> +++ b/src/cam/event_loop.cpp\n> @@ -5,19 +5,34 @@\n>   * event_loop.cpp - cam - Event loop\n>   */\n>  \n> -#include <libcamera/event_dispatcher.h>\n> -\n>  #include \"event_loop.h\"\n>  \n> -using namespace libcamera;\n> +#include <assert.h>\n> +#include <event2/event.h>\n> +#include <event2/thread.h>\n>  \n> -EventLoop::EventLoop(EventDispatcher *dispatcher)\n> -\t: dispatcher_(dispatcher)\n> +EventLoop *EventLoop::instance_ = nullptr;\n> +\n> +EventLoop::EventLoop()\n>  {\n> +\tassert(!instance_);\n> +\n> +\tevthread_use_pthreads();\n> +\tevent_ = event_base_new();\n> +\tinstance_ = this;\n>  }\n>  \n>  EventLoop::~EventLoop()\n>  {\n> +\tinstance_ = nullptr;\n> +\n> +\tevent_base_free(event_);\n> +\tlibevent_global_shutdown();\n> +}\n> +\n> +EventLoop *EventLoop::instance()\n> +{\n> +\treturn instance_;\n>  }\n>  \n>  int EventLoop::exec()\n> @@ -26,7 +41,7 @@ int EventLoop::exec()\n>  \texit_.store(false, std::memory_order_release);\n>  \n>  \twhile (!exit_.load(std::memory_order_acquire))\n> -\t\tdispatcher_->processEvents();\n> +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n>  \n>  \treturn exitCode_;\n>  }\n> @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n>  {\n>  \texitCode_ = code;\n>  \texit_.store(true, std::memory_order_release);\n> -\tdispatcher_->interrupt();\n> +\tinterrupt();\n> +}\n> +\n> +void EventLoop::interrupt()\n> +{\n> +\tevent_base_loopbreak(event_);\n>  }\n> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n> index 581c7cba2fc4..b1c6bd103080 100644\n> --- a/src/cam/event_loop.h\n> +++ b/src/cam/event_loop.h\n> @@ -9,26 +9,27 @@\n>  \n>  #include <atomic>\n>  \n> -#include <libcamera/event_notifier.h>\n> -\n> -namespace libcamera {\n> -class EventDispatcher;\n> -}\n> +struct event_base;\n>  \n>  class EventLoop\n>  {\n>  public:\n> -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n> +\tEventLoop();\n>  \t~EventLoop();\n>  \n> +\tstatic EventLoop *instance();\n> +\n>  \tint exec();\n>  \tvoid exit(int code = 0);\n>  \n>  private:\n> -\tlibcamera::EventDispatcher *dispatcher_;\n> +\tstatic EventLoop *instance_;\n>  \n> +\tstruct event_base *event_;\n>  \tstd::atomic<bool> exit_;\n>  \tint exitCode_;\n> +\n> +\tvoid interrupt();\n>  };\n>  \n>  #endif /* __CAM_EVENT_LOOP_H__ */\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index b3a8d94f5739..e01be63a7058 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -52,7 +52,7 @@ private:\n>  \tCameraManager *cm_;\n>  \tstd::shared_ptr<Camera> camera_;\n>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> -\tEventLoop *loop_;\n> +\tEventLoop loop_;\n>  \n>  \tbool strictFormats_;\n>  };\n> @@ -60,7 +60,7 @@ private:\n>  CamApp *CamApp::app_ = nullptr;\n>  \n>  CamApp::CamApp()\n> -\t: cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),\n> +\t: cm_(nullptr), camera_(nullptr), config_(nullptr),\n>  \t  strictFormats_(false)\n>  {\n>  \tCamApp::app_ = this;\n> @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)\n>  \t\tstd::cout << \"Monitoring new hotplug and unplug events\" << std::endl;\n>  \t}\n>  \n> -\tloop_ = new EventLoop(cm_->eventDispatcher());\n> -\n>  \treturn 0;\n>  }\n>  \n>  void CamApp::cleanup()\n>  {\n> -\tdelete loop_;\n> -\tloop_ = nullptr;\n> -\n>  \tif (camera_) {\n>  \t\tcamera_->release();\n>  \t\tcamera_.reset();\n> @@ -166,8 +161,7 @@ int CamApp::exec()\n>  \n>  void CamApp::quit()\n>  {\n> -\tif (loop_)\n> -\t\tloop_->exit();\n> +\tloop_.exit();\n>  }\n>  \n>  int CamApp::parseOptions(int argc, char *argv[])\n> @@ -366,13 +360,13 @@ int CamApp::run()\n>  \t}\n>  \n>  \tif (options_.isSet(OptCapture)) {\n> -\t\tCapture capture(camera_, config_.get(), loop_);\n> +\t\tCapture capture(camera_, config_.get(), &loop_);\n>  \t\treturn capture.run(options_);\n>  \t}\n>  \n>  \tif (options_.isSet(OptMonitor)) {\n>  \t\tstd::cout << \"Press Ctrl-C to interrupt\" << std::endl;\n> -\t\tret = loop_->exec();\n> +\t\tret = loop_.exec();\n>  \t\tif (ret)\n>  \t\t\tstd::cout << \"Failed to run monitor loop\" << std::endl;\n>  \t}\n> diff --git a/src/cam/meson.build b/src/cam/meson.build\n> index 89e124fbae2a..62003c58dad0 100644\n> --- a/src/cam/meson.build\n> +++ b/src/cam/meson.build\n> @@ -1,5 +1,12 @@\n>  # SPDX-License-Identifier: CC0-1.0\n>  \n> +libevent = dependency('libevent_pthreads', required : false)\n> +\n> +if not libevent.found()\n> +    warning('libevent_pthreads not found,\\'cam\\' application will not be compiled')\n\nmissing a space after comma,\n\n\n> +    subdir_done()\n> +endif\n> +\n>  cam_sources = files([\n>      'buffer_writer.cpp',\n>      'capture.cpp',\n> @@ -10,5 +17,9 @@ cam_sources = files([\n>  ])\n>  \n>  cam  = executable('cam', cam_sources,\n> -                  dependencies : [ libatomic, libcamera_dep ],\n> +                  dependencies : [\n> +                      libatomic,\n> +                      libcamera_dep,\n> +                      libevent,\n> +                  ],\n>                    install : true)\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 959ECBE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Nov 2020 09:59:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 26877631BC;\n\tFri, 13 Nov 2020 10:59:06 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9EC67631B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Nov 2020 10:59:05 +0100 (CET)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1209031A;\n\tFri, 13 Nov 2020 10:59:05 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"GLLOcLFO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605261545;\n\tbh=SyiwN0l2RvZZmivQx2Ow9YA1lZVaLloXvDr2VV6dKH0=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=GLLOcLFO0BAONCr6oiQsTONTPrEQm2FeW2ThyTRdwN3NQ2zynHrtAtmamrsJDvd5+\n\tzuuRDOJez5fBm3HdkTftA4APVpqfUM4Uuxy3ksvSnTSBI/cbPsk5MPkM1eHvMgBr8A\n\tmLf5Y4+6SBqKpa8Cuyq+ejPhW8RBMH4+CsOO9PDM=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<ec2e9d0f-0c20-7098-d521-71861e568f81@ideasonboard.com>","Date":"Fri, 13 Nov 2020 09:59:02 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Reply-To":"kieran.bingham@ideasonboard.com","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13701,"web_url":"https://patchwork.libcamera.org/comment/13701/","msgid":"<20201113100823.GI7524@pendragon.ideasonboard.com>","date":"2020-11-13T10:08:23","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Nov 13, 2020 at 09:59:02AM +0000, Kieran Bingham wrote:\n> On 13/11/2020 06:38, Laurent Pinchart wrote:\n> > To prepare for removal of the EventDispatcher from the libcamera public\n> > API, switch to libevent to handle the event loop.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> This is missing an update to the README.rst to update the new package\n> dependencies.\n\ndiff --git a/README.rst b/README.rst\nindex 5c4b6989f7cf..251291b77c62 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -78,6 +78,9 @@ for documentation: [optional]\n for gstreamer: [optional]\n \tlibgstreamer1.0-dev libgstreamer-plugins-base1.0-dev\n\n+for cam: [optional]\n+        libevent-dev\n+\n for qcam: [optional]\n \tqtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 qttools5-dev-tools libtiff-dev\n\n> And a small whitespace nit below.\n> \n> With those:\n> \n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> > ---\n> >  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n> >  src/cam/event_loop.h   | 15 ++++++++-------\n> >  src/cam/main.cpp       | 16 +++++-----------\n> >  src/cam/meson.build    | 13 ++++++++++++-\n> >  4 files changed, 52 insertions(+), 26 deletions(-)\n> > \n> > diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n> > index e8ab861790ed..13f2583da0a1 100644\n> > --- a/src/cam/event_loop.cpp\n> > +++ b/src/cam/event_loop.cpp\n> > @@ -5,19 +5,34 @@\n> >   * event_loop.cpp - cam - Event loop\n> >   */\n> >  \n> > -#include <libcamera/event_dispatcher.h>\n> > -\n> >  #include \"event_loop.h\"\n> >  \n> > -using namespace libcamera;\n> > +#include <assert.h>\n> > +#include <event2/event.h>\n> > +#include <event2/thread.h>\n> >  \n> > -EventLoop::EventLoop(EventDispatcher *dispatcher)\n> > -\t: dispatcher_(dispatcher)\n> > +EventLoop *EventLoop::instance_ = nullptr;\n> > +\n> > +EventLoop::EventLoop()\n> >  {\n> > +\tassert(!instance_);\n> > +\n> > +\tevthread_use_pthreads();\n> > +\tevent_ = event_base_new();\n> > +\tinstance_ = this;\n> >  }\n> >  \n> >  EventLoop::~EventLoop()\n> >  {\n> > +\tinstance_ = nullptr;\n> > +\n> > +\tevent_base_free(event_);\n> > +\tlibevent_global_shutdown();\n> > +}\n> > +\n> > +EventLoop *EventLoop::instance()\n> > +{\n> > +\treturn instance_;\n> >  }\n> >  \n> >  int EventLoop::exec()\n> > @@ -26,7 +41,7 @@ int EventLoop::exec()\n> >  \texit_.store(false, std::memory_order_release);\n> >  \n> >  \twhile (!exit_.load(std::memory_order_acquire))\n> > -\t\tdispatcher_->processEvents();\n> > +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n> >  \n> >  \treturn exitCode_;\n> >  }\n> > @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n> >  {\n> >  \texitCode_ = code;\n> >  \texit_.store(true, std::memory_order_release);\n> > -\tdispatcher_->interrupt();\n> > +\tinterrupt();\n> > +}\n> > +\n> > +void EventLoop::interrupt()\n> > +{\n> > +\tevent_base_loopbreak(event_);\n> >  }\n> > diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n> > index 581c7cba2fc4..b1c6bd103080 100644\n> > --- a/src/cam/event_loop.h\n> > +++ b/src/cam/event_loop.h\n> > @@ -9,26 +9,27 @@\n> >  \n> >  #include <atomic>\n> >  \n> > -#include <libcamera/event_notifier.h>\n> > -\n> > -namespace libcamera {\n> > -class EventDispatcher;\n> > -}\n> > +struct event_base;\n> >  \n> >  class EventLoop\n> >  {\n> >  public:\n> > -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n> > +\tEventLoop();\n> >  \t~EventLoop();\n> >  \n> > +\tstatic EventLoop *instance();\n> > +\n> >  \tint exec();\n> >  \tvoid exit(int code = 0);\n> >  \n> >  private:\n> > -\tlibcamera::EventDispatcher *dispatcher_;\n> > +\tstatic EventLoop *instance_;\n> >  \n> > +\tstruct event_base *event_;\n> >  \tstd::atomic<bool> exit_;\n> >  \tint exitCode_;\n> > +\n> > +\tvoid interrupt();\n> >  };\n> >  \n> >  #endif /* __CAM_EVENT_LOOP_H__ */\n> > diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> > index b3a8d94f5739..e01be63a7058 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -52,7 +52,7 @@ private:\n> >  \tCameraManager *cm_;\n> >  \tstd::shared_ptr<Camera> camera_;\n> >  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> > -\tEventLoop *loop_;\n> > +\tEventLoop loop_;\n> >  \n> >  \tbool strictFormats_;\n> >  };\n> > @@ -60,7 +60,7 @@ private:\n> >  CamApp *CamApp::app_ = nullptr;\n> >  \n> >  CamApp::CamApp()\n> > -\t: cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),\n> > +\t: cm_(nullptr), camera_(nullptr), config_(nullptr),\n> >  \t  strictFormats_(false)\n> >  {\n> >  \tCamApp::app_ = this;\n> > @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)\n> >  \t\tstd::cout << \"Monitoring new hotplug and unplug events\" << std::endl;\n> >  \t}\n> >  \n> > -\tloop_ = new EventLoop(cm_->eventDispatcher());\n> > -\n> >  \treturn 0;\n> >  }\n> >  \n> >  void CamApp::cleanup()\n> >  {\n> > -\tdelete loop_;\n> > -\tloop_ = nullptr;\n> > -\n> >  \tif (camera_) {\n> >  \t\tcamera_->release();\n> >  \t\tcamera_.reset();\n> > @@ -166,8 +161,7 @@ int CamApp::exec()\n> >  \n> >  void CamApp::quit()\n> >  {\n> > -\tif (loop_)\n> > -\t\tloop_->exit();\n> > +\tloop_.exit();\n> >  }\n> >  \n> >  int CamApp::parseOptions(int argc, char *argv[])\n> > @@ -366,13 +360,13 @@ int CamApp::run()\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptCapture)) {\n> > -\t\tCapture capture(camera_, config_.get(), loop_);\n> > +\t\tCapture capture(camera_, config_.get(), &loop_);\n> >  \t\treturn capture.run(options_);\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptMonitor)) {\n> >  \t\tstd::cout << \"Press Ctrl-C to interrupt\" << std::endl;\n> > -\t\tret = loop_->exec();\n> > +\t\tret = loop_.exec();\n> >  \t\tif (ret)\n> >  \t\t\tstd::cout << \"Failed to run monitor loop\" << std::endl;\n> >  \t}\n> > diff --git a/src/cam/meson.build b/src/cam/meson.build\n> > index 89e124fbae2a..62003c58dad0 100644\n> > --- a/src/cam/meson.build\n> > +++ b/src/cam/meson.build\n> > @@ -1,5 +1,12 @@\n> >  # SPDX-License-Identifier: CC0-1.0\n> >  \n> > +libevent = dependency('libevent_pthreads', required : false)\n> > +\n> > +if not libevent.found()\n> > +    warning('libevent_pthreads not found,\\'cam\\' application will not be compiled')\n> \n> missing a space after comma,\n> \n> > +    subdir_done()\n> > +endif\n> > +\n> >  cam_sources = files([\n> >      'buffer_writer.cpp',\n> >      'capture.cpp',\n> > @@ -10,5 +17,9 @@ cam_sources = files([\n> >  ])\n> >  \n> >  cam  = executable('cam', cam_sources,\n> > -                  dependencies : [ libatomic, libcamera_dep ],\n> > +                  dependencies : [\n> > +                      libatomic,\n> > +                      libcamera_dep,\n> > +                      libevent,\n> > +                  ],\n> >                    install : true)\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id CD5ACBE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Nov 2020 10:08:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9B5AE631BD;\n\tFri, 13 Nov 2020 11:08:29 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CF23A631B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Nov 2020 11:08:27 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 60F6231A;\n\tFri, 13 Nov 2020 11:08:27 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"t4uV3WzA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605262107;\n\tbh=taUOjQXdmsSoZOH9eqffFA6LuGQPxLqeBsF0wmE+o3Y=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=t4uV3WzA6PgCU/fqCvGfhjsAreWnXD2Nf2ozSYCnZfS2/ofhsEnfZuaVqerZN6Aev\n\tkO/Htwfzzg+AhHf0ecwsyzFHligRfsTqcBhqdgvZO7yxYevQ4yiEtomDTT7IRVGmqa\n\t9wPRZJyfnR9K6yRHa+6OZ/ziXM0J8xd1uZ5tPmxk=","Date":"Fri, 13 Nov 2020 12:08:23 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201113100823.GI7524@pendragon.ideasonboard.com>","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>\n\t<ec2e9d0f-0c20-7098-d521-71861e568f81@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<ec2e9d0f-0c20-7098-d521-71861e568f81@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13702,"web_url":"https://patchwork.libcamera.org/comment/13702/","msgid":"<905943dc-dcd1-3ce8-d8b9-a67b98792434@ideasonboard.com>","date":"2020-11-13T10:13:59","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 13/11/2020 10:08, Laurent Pinchart wrote:\n> On Fri, Nov 13, 2020 at 09:59:02AM +0000, Kieran Bingham wrote:\n>> On 13/11/2020 06:38, Laurent Pinchart wrote:\n>>> To prepare for removal of the EventDispatcher from the libcamera public\n>>> API, switch to libevent to handle the event loop.\n>>>\n>>> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>\n>> This is missing an update to the README.rst to update the new package\n>> dependencies.\n> \n> diff --git a/README.rst b/README.rst\n> index 5c4b6989f7cf..251291b77c62 100644\n> --- a/README.rst\n> +++ b/README.rst\n> @@ -78,6 +78,9 @@ for documentation: [optional]\n>  for gstreamer: [optional]\n>  \tlibgstreamer1.0-dev libgstreamer-plugins-base1.0-dev\n> \n> +for cam: [optional]\n> +        libevent-dev\n> +\n\n\nLooks good to me ;-)\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>  for qcam: [optional]\n>  \tqtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 qttools5-dev-tools libtiff-dev\n> \n>> And a small whitespace nit below.\n>>\n>> With those:\n>>\n>> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>>\n>>> ---\n>>>  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n>>>  src/cam/event_loop.h   | 15 ++++++++-------\n>>>  src/cam/main.cpp       | 16 +++++-----------\n>>>  src/cam/meson.build    | 13 ++++++++++++-\n>>>  4 files changed, 52 insertions(+), 26 deletions(-)\n>>>\n>>> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n>>> index e8ab861790ed..13f2583da0a1 100644\n>>> --- a/src/cam/event_loop.cpp\n>>> +++ b/src/cam/event_loop.cpp\n>>> @@ -5,19 +5,34 @@\n>>>   * event_loop.cpp - cam - Event loop\n>>>   */\n>>>  \n>>> -#include <libcamera/event_dispatcher.h>\n>>> -\n>>>  #include \"event_loop.h\"\n>>>  \n>>> -using namespace libcamera;\n>>> +#include <assert.h>\n>>> +#include <event2/event.h>\n>>> +#include <event2/thread.h>\n>>>  \n>>> -EventLoop::EventLoop(EventDispatcher *dispatcher)\n>>> -\t: dispatcher_(dispatcher)\n>>> +EventLoop *EventLoop::instance_ = nullptr;\n>>> +\n>>> +EventLoop::EventLoop()\n>>>  {\n>>> +\tassert(!instance_);\n>>> +\n>>> +\tevthread_use_pthreads();\n>>> +\tevent_ = event_base_new();\n>>> +\tinstance_ = this;\n>>>  }\n>>>  \n>>>  EventLoop::~EventLoop()\n>>>  {\n>>> +\tinstance_ = nullptr;\n>>> +\n>>> +\tevent_base_free(event_);\n>>> +\tlibevent_global_shutdown();\n>>> +}\n>>> +\n>>> +EventLoop *EventLoop::instance()\n>>> +{\n>>> +\treturn instance_;\n>>>  }\n>>>  \n>>>  int EventLoop::exec()\n>>> @@ -26,7 +41,7 @@ int EventLoop::exec()\n>>>  \texit_.store(false, std::memory_order_release);\n>>>  \n>>>  \twhile (!exit_.load(std::memory_order_acquire))\n>>> -\t\tdispatcher_->processEvents();\n>>> +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n>>>  \n>>>  \treturn exitCode_;\n>>>  }\n>>> @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n>>>  {\n>>>  \texitCode_ = code;\n>>>  \texit_.store(true, std::memory_order_release);\n>>> -\tdispatcher_->interrupt();\n>>> +\tinterrupt();\n>>> +}\n>>> +\n>>> +void EventLoop::interrupt()\n>>> +{\n>>> +\tevent_base_loopbreak(event_);\n>>>  }\n>>> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n>>> index 581c7cba2fc4..b1c6bd103080 100644\n>>> --- a/src/cam/event_loop.h\n>>> +++ b/src/cam/event_loop.h\n>>> @@ -9,26 +9,27 @@\n>>>  \n>>>  #include <atomic>\n>>>  \n>>> -#include <libcamera/event_notifier.h>\n>>> -\n>>> -namespace libcamera {\n>>> -class EventDispatcher;\n>>> -}\n>>> +struct event_base;\n>>>  \n>>>  class EventLoop\n>>>  {\n>>>  public:\n>>> -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n>>> +\tEventLoop();\n>>>  \t~EventLoop();\n>>>  \n>>> +\tstatic EventLoop *instance();\n>>> +\n>>>  \tint exec();\n>>>  \tvoid exit(int code = 0);\n>>>  \n>>>  private:\n>>> -\tlibcamera::EventDispatcher *dispatcher_;\n>>> +\tstatic EventLoop *instance_;\n>>>  \n>>> +\tstruct event_base *event_;\n>>>  \tstd::atomic<bool> exit_;\n>>>  \tint exitCode_;\n>>> +\n>>> +\tvoid interrupt();\n>>>  };\n>>>  \n>>>  #endif /* __CAM_EVENT_LOOP_H__ */\n>>> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n>>> index b3a8d94f5739..e01be63a7058 100644\n>>> --- a/src/cam/main.cpp\n>>> +++ b/src/cam/main.cpp\n>>> @@ -52,7 +52,7 @@ private:\n>>>  \tCameraManager *cm_;\n>>>  \tstd::shared_ptr<Camera> camera_;\n>>>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n>>> -\tEventLoop *loop_;\n>>> +\tEventLoop loop_;\n>>>  \n>>>  \tbool strictFormats_;\n>>>  };\n>>> @@ -60,7 +60,7 @@ private:\n>>>  CamApp *CamApp::app_ = nullptr;\n>>>  \n>>>  CamApp::CamApp()\n>>> -\t: cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),\n>>> +\t: cm_(nullptr), camera_(nullptr), config_(nullptr),\n>>>  \t  strictFormats_(false)\n>>>  {\n>>>  \tCamApp::app_ = this;\n>>> @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)\n>>>  \t\tstd::cout << \"Monitoring new hotplug and unplug events\" << std::endl;\n>>>  \t}\n>>>  \n>>> -\tloop_ = new EventLoop(cm_->eventDispatcher());\n>>> -\n>>>  \treturn 0;\n>>>  }\n>>>  \n>>>  void CamApp::cleanup()\n>>>  {\n>>> -\tdelete loop_;\n>>> -\tloop_ = nullptr;\n>>> -\n>>>  \tif (camera_) {\n>>>  \t\tcamera_->release();\n>>>  \t\tcamera_.reset();\n>>> @@ -166,8 +161,7 @@ int CamApp::exec()\n>>>  \n>>>  void CamApp::quit()\n>>>  {\n>>> -\tif (loop_)\n>>> -\t\tloop_->exit();\n>>> +\tloop_.exit();\n>>>  }\n>>>  \n>>>  int CamApp::parseOptions(int argc, char *argv[])\n>>> @@ -366,13 +360,13 @@ int CamApp::run()\n>>>  \t}\n>>>  \n>>>  \tif (options_.isSet(OptCapture)) {\n>>> -\t\tCapture capture(camera_, config_.get(), loop_);\n>>> +\t\tCapture capture(camera_, config_.get(), &loop_);\n>>>  \t\treturn capture.run(options_);\n>>>  \t}\n>>>  \n>>>  \tif (options_.isSet(OptMonitor)) {\n>>>  \t\tstd::cout << \"Press Ctrl-C to interrupt\" << std::endl;\n>>> -\t\tret = loop_->exec();\n>>> +\t\tret = loop_.exec();\n>>>  \t\tif (ret)\n>>>  \t\t\tstd::cout << \"Failed to run monitor loop\" << std::endl;\n>>>  \t}\n>>> diff --git a/src/cam/meson.build b/src/cam/meson.build\n>>> index 89e124fbae2a..62003c58dad0 100644\n>>> --- a/src/cam/meson.build\n>>> +++ b/src/cam/meson.build\n>>> @@ -1,5 +1,12 @@\n>>>  # SPDX-License-Identifier: CC0-1.0\n>>>  \n>>> +libevent = dependency('libevent_pthreads', required : false)\n>>> +\n>>> +if not libevent.found()\n>>> +    warning('libevent_pthreads not found,\\'cam\\' application will not be compiled')\n>>\n>> missing a space after comma,\n>>\n>>> +    subdir_done()\n>>> +endif\n>>> +\n>>>  cam_sources = files([\n>>>      'buffer_writer.cpp',\n>>>      'capture.cpp',\n>>> @@ -10,5 +17,9 @@ cam_sources = files([\n>>>  ])\n>>>  \n>>>  cam  = executable('cam', cam_sources,\n>>> -                  dependencies : [ libatomic, libcamera_dep ],\n>>> +                  dependencies : [\n>>> +                      libatomic,\n>>> +                      libcamera_dep,\n>>> +                      libevent,\n>>> +                  ],\n>>>                    install : true)\n>>>\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1A8E4BE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Nov 2020 10:14:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 59D77631BE;\n\tFri, 13 Nov 2020 11:14:04 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E7145631B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Nov 2020 11:14:02 +0100 (CET)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7083A31A;\n\tFri, 13 Nov 2020 11:14:02 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"EjHGkV1Y\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605262442;\n\tbh=fbXxrLkf9yaeF3CZ9zjK9zU2VBOLAZftszqEqAfK07U=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=EjHGkV1YMjqgxKeQF65LPLzBGEGw9a972LrxhqyE6OYxB6RIspLfU8SWa9EO1NF6B\n\tjt1TBtZkzu3bePcpKboYsEWcum7kTnvexBw9kx897EmxtGMF/LBXZI2gOmVepoHyjg\n\t0f69N2Hh1kVNALb5f3RqE/X6pUyNL04Do/YLFc6E=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>\n\t<ec2e9d0f-0c20-7098-d521-71861e568f81@ideasonboard.com>\n\t<20201113100823.GI7524@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<905943dc-dcd1-3ce8-d8b9-a67b98792434@ideasonboard.com>","Date":"Fri, 13 Nov 2020 10:13:59 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201113100823.GI7524@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13704,"web_url":"https://patchwork.libcamera.org/comment/13704/","msgid":"<20201113102650.GF1603296@oden.dyn.berto.se>","date":"2020-11-13T10:26:50","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your work.\n\nOn 2020-11-13 08:38:12 +0200, Laurent Pinchart wrote:\n> To prepare for removal of the EventDispatcher from the libcamera public\n> API, switch to libevent to handle the event loop.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nWith the issue pointed out by Kieran fixed,\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n>  src/cam/event_loop.h   | 15 ++++++++-------\n>  src/cam/main.cpp       | 16 +++++-----------\n>  src/cam/meson.build    | 13 ++++++++++++-\n>  4 files changed, 52 insertions(+), 26 deletions(-)\n> \n> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n> index e8ab861790ed..13f2583da0a1 100644\n> --- a/src/cam/event_loop.cpp\n> +++ b/src/cam/event_loop.cpp\n> @@ -5,19 +5,34 @@\n>   * event_loop.cpp - cam - Event loop\n>   */\n>  \n> -#include <libcamera/event_dispatcher.h>\n> -\n>  #include \"event_loop.h\"\n>  \n> -using namespace libcamera;\n> +#include <assert.h>\n> +#include <event2/event.h>\n> +#include <event2/thread.h>\n>  \n> -EventLoop::EventLoop(EventDispatcher *dispatcher)\n> -\t: dispatcher_(dispatcher)\n> +EventLoop *EventLoop::instance_ = nullptr;\n> +\n> +EventLoop::EventLoop()\n>  {\n> +\tassert(!instance_);\n> +\n> +\tevthread_use_pthreads();\n> +\tevent_ = event_base_new();\n> +\tinstance_ = this;\n>  }\n>  \n>  EventLoop::~EventLoop()\n>  {\n> +\tinstance_ = nullptr;\n> +\n> +\tevent_base_free(event_);\n> +\tlibevent_global_shutdown();\n> +}\n> +\n> +EventLoop *EventLoop::instance()\n> +{\n> +\treturn instance_;\n>  }\n>  \n>  int EventLoop::exec()\n> @@ -26,7 +41,7 @@ int EventLoop::exec()\n>  \texit_.store(false, std::memory_order_release);\n>  \n>  \twhile (!exit_.load(std::memory_order_acquire))\n> -\t\tdispatcher_->processEvents();\n> +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n>  \n>  \treturn exitCode_;\n>  }\n> @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n>  {\n>  \texitCode_ = code;\n>  \texit_.store(true, std::memory_order_release);\n> -\tdispatcher_->interrupt();\n> +\tinterrupt();\n> +}\n> +\n> +void EventLoop::interrupt()\n> +{\n> +\tevent_base_loopbreak(event_);\n>  }\n> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n> index 581c7cba2fc4..b1c6bd103080 100644\n> --- a/src/cam/event_loop.h\n> +++ b/src/cam/event_loop.h\n> @@ -9,26 +9,27 @@\n>  \n>  #include <atomic>\n>  \n> -#include <libcamera/event_notifier.h>\n> -\n> -namespace libcamera {\n> -class EventDispatcher;\n> -}\n> +struct event_base;\n>  \n>  class EventLoop\n>  {\n>  public:\n> -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n> +\tEventLoop();\n>  \t~EventLoop();\n>  \n> +\tstatic EventLoop *instance();\n> +\n>  \tint exec();\n>  \tvoid exit(int code = 0);\n>  \n>  private:\n> -\tlibcamera::EventDispatcher *dispatcher_;\n> +\tstatic EventLoop *instance_;\n>  \n> +\tstruct event_base *event_;\n>  \tstd::atomic<bool> exit_;\n>  \tint exitCode_;\n> +\n> +\tvoid interrupt();\n>  };\n>  \n>  #endif /* __CAM_EVENT_LOOP_H__ */\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index b3a8d94f5739..e01be63a7058 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -52,7 +52,7 @@ private:\n>  \tCameraManager *cm_;\n>  \tstd::shared_ptr<Camera> camera_;\n>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> -\tEventLoop *loop_;\n> +\tEventLoop loop_;\n>  \n>  \tbool strictFormats_;\n>  };\n> @@ -60,7 +60,7 @@ private:\n>  CamApp *CamApp::app_ = nullptr;\n>  \n>  CamApp::CamApp()\n> -\t: cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),\n> +\t: cm_(nullptr), camera_(nullptr), config_(nullptr),\n>  \t  strictFormats_(false)\n>  {\n>  \tCamApp::app_ = this;\n> @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)\n>  \t\tstd::cout << \"Monitoring new hotplug and unplug events\" << std::endl;\n>  \t}\n>  \n> -\tloop_ = new EventLoop(cm_->eventDispatcher());\n> -\n>  \treturn 0;\n>  }\n>  \n>  void CamApp::cleanup()\n>  {\n> -\tdelete loop_;\n> -\tloop_ = nullptr;\n> -\n>  \tif (camera_) {\n>  \t\tcamera_->release();\n>  \t\tcamera_.reset();\n> @@ -166,8 +161,7 @@ int CamApp::exec()\n>  \n>  void CamApp::quit()\n>  {\n> -\tif (loop_)\n> -\t\tloop_->exit();\n> +\tloop_.exit();\n>  }\n>  \n>  int CamApp::parseOptions(int argc, char *argv[])\n> @@ -366,13 +360,13 @@ int CamApp::run()\n>  \t}\n>  \n>  \tif (options_.isSet(OptCapture)) {\n> -\t\tCapture capture(camera_, config_.get(), loop_);\n> +\t\tCapture capture(camera_, config_.get(), &loop_);\n>  \t\treturn capture.run(options_);\n>  \t}\n>  \n>  \tif (options_.isSet(OptMonitor)) {\n>  \t\tstd::cout << \"Press Ctrl-C to interrupt\" << std::endl;\n> -\t\tret = loop_->exec();\n> +\t\tret = loop_.exec();\n>  \t\tif (ret)\n>  \t\t\tstd::cout << \"Failed to run monitor loop\" << std::endl;\n>  \t}\n> diff --git a/src/cam/meson.build b/src/cam/meson.build\n> index 89e124fbae2a..62003c58dad0 100644\n> --- a/src/cam/meson.build\n> +++ b/src/cam/meson.build\n> @@ -1,5 +1,12 @@\n>  # SPDX-License-Identifier: CC0-1.0\n>  \n> +libevent = dependency('libevent_pthreads', required : false)\n> +\n> +if not libevent.found()\n> +    warning('libevent_pthreads not found,\\'cam\\' application will not be compiled')\n> +    subdir_done()\n> +endif\n> +\n>  cam_sources = files([\n>      'buffer_writer.cpp',\n>      'capture.cpp',\n> @@ -10,5 +17,9 @@ cam_sources = files([\n>  ])\n>  \n>  cam  = executable('cam', cam_sources,\n> -                  dependencies : [ libatomic, libcamera_dep ],\n> +                  dependencies : [\n> +                      libatomic,\n> +                      libcamera_dep,\n> +                      libevent,\n> +                  ],\n>                    install : true)\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C788FBE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Nov 2020 10:26:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5B112631BC;\n\tFri, 13 Nov 2020 11:26:53 +0100 (CET)","from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 63B13631B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Nov 2020 11:26:52 +0100 (CET)","by mail-lf1-x141.google.com with SMTP id 74so13056233lfo.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Nov 2020 02:26:52 -0800 (PST)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tb25sm590095lfi.173.2020.11.13.02.26.50\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 13 Nov 2020 02:26:51 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"oprAt9tX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=alHQpBGkZhZWMI2rT8qHxvJESex4wZ0x2rPuJ7AATpI=;\n\tb=oprAt9tXsBBS9FM85XJDeUq6W5HpfB//JOplOJ8CqyFvFgeXMG0nEhGrmycppX63Pm\n\tWjTx+npZEe3pmpHxmZIavIW9oCDoB169mwP6yvKAnurVDA+sHGXWGxKKVIXGf/H7Fn8l\n\tb38h/sH7EBxzmRQjJEwXWO7KteoaLHvxWQEdVU50LKfof6UzuWuIQodDrigMLoj51Shk\n\tVyFpfx7nh2itRHOxoLazA1oXJkDx/P1WIPpwbl9D7MRILVJHylL53InrP1RCNpzNo3xU\n\tkUeu0V/T14MJmgsr9onwun286IQZa+f3cEZnhE5b4LIP2UZqDwwkOAG7CMqt3AABOMY0\n\t1gtg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=alHQpBGkZhZWMI2rT8qHxvJESex4wZ0x2rPuJ7AATpI=;\n\tb=DNvJBcrR2tDHpUH8odh5IncJxfCUVJ90y3YUhEeVC5dPOgpK0B76KGv+JoyXeMA6jl\n\tblWAQ85eJi48d1M9VFdw0zQo9ynAx70iglGulwrgFF2wCmBTJkicxih9JVwzjGecMCZb\n\tMcDLznIsGhImEJIrZUcTVZTPTJxy8BCLlBj2il8YzEi+jNAHYr+nYziKAnEcVMgLvdic\n\tX9a4YwPkb4CllVzo17EyMnZ2dtE3efGKst0BpachvhkfbxfmvSjDsh6VJHW1PgdD/VFE\n\tNGUuUjd8lh6LZ5hXEXudminvGpSujy31u3J1iRPGkdH/SynMTAE3puo4j3XZUo0YEw6o\n\tScew==","X-Gm-Message-State":"AOAM5321JDy9vTb+UzW8ZZKEFdNKU1O5cDJTHkpJT+6olQW2sBdDifCN\n\tk4BbZxRM50mD1any9vRCsW48NJvOaI9xpg==","X-Google-Smtp-Source":"ABdhPJzW5Ezz7YnvmRPbVejGNeoT8DzkFN/WV5xjlMXaQ/7ZW7fCu0LclX7/x1G1YHHDo9Ph7vsRQg==","X-Received":"by 2002:a19:a0c:: with SMTP id 12mr659206lfk.568.1605263211713; \n\tFri, 13 Nov 2020 02:26:51 -0800 (PST)","Date":"Fri, 13 Nov 2020 11:26:50 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20201113102650.GF1603296@oden.dyn.berto.se>","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13720,"web_url":"https://patchwork.libcamera.org/comment/13720/","msgid":"<8706d2a7-1345-cfdf-28a5-e5b812b2ac6c@ideasonboard.com>","date":"2020-11-16T11:52:47","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 13/11/2020 06:38, Laurent Pinchart wrote:\n> To prepare for removal of the EventDispatcher from the libcamera public\n> API, switch to libevent to handle the event loop.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n>  src/cam/event_loop.h   | 15 ++++++++-------\n>  src/cam/main.cpp       | 16 +++++-----------\n>  src/cam/meson.build    | 13 ++++++++++++-\n>  4 files changed, 52 insertions(+), 26 deletions(-)\n> \n> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n> index e8ab861790ed..13f2583da0a1 100644\n> --- a/src/cam/event_loop.cpp\n> +++ b/src/cam/event_loop.cpp\n> @@ -5,19 +5,34 @@\n>   * event_loop.cpp - cam - Event loop\n>   */\n>  \n> -#include <libcamera/event_dispatcher.h>\n> -\n>  #include \"event_loop.h\"\n>  \n> -using namespace libcamera;\n> +#include <assert.h>\n> +#include <event2/event.h>\n> +#include <event2/thread.h>\n>  \n> -EventLoop::EventLoop(EventDispatcher *dispatcher)\n> -\t: dispatcher_(dispatcher)\n> +EventLoop *EventLoop::instance_ = nullptr;\n> +\n> +EventLoop::EventLoop()\n>  {\n> +\tassert(!instance_);\n> +\n> +\tevthread_use_pthreads();\n> +\tevent_ = event_base_new();\n> +\tinstance_ = this;\n>  }\n>  \n>  EventLoop::~EventLoop()\n>  {\n> +\tinstance_ = nullptr;\n> +\n> +\tevent_base_free(event_);\n> +\tlibevent_global_shutdown();\n> +}\n> +\n> +EventLoop *EventLoop::instance()\n> +{\n> +\treturn instance_;\n>  }\n>  \n>  int EventLoop::exec()\n> @@ -26,7 +41,7 @@ int EventLoop::exec()\n>  \texit_.store(false, std::memory_order_release);\n>  \n>  \twhile (!exit_.load(std::memory_order_acquire))\n> -\t\tdispatcher_->processEvents();\n> +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n>  \n>  \treturn exitCode_;\n>  }\n> @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n>  {\n>  \texitCode_ = code;\n>  \texit_.store(true, std::memory_order_release);\n> -\tdispatcher_->interrupt();\n> +\tinterrupt();\n> +}\n> +\n> +void EventLoop::interrupt()\n> +{\n> +\tevent_base_loopbreak(event_);\n>  }\n> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n> index 581c7cba2fc4..b1c6bd103080 100644\n> --- a/src/cam/event_loop.h\n> +++ b/src/cam/event_loop.h\n> @@ -9,26 +9,27 @@\n>  \n>  #include <atomic>\n>  \n> -#include <libcamera/event_notifier.h>\n> -\n> -namespace libcamera {\n> -class EventDispatcher;\n> -}\n> +struct event_base;\n>  \n>  class EventLoop\n>  {\n>  public:\n> -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n> +\tEventLoop();\n>  \t~EventLoop();\n>  \n> +\tstatic EventLoop *instance();\n> +\n>  \tint exec();\n>  \tvoid exit(int code = 0);\n>  \n>  private:\n> -\tlibcamera::EventDispatcher *dispatcher_;\n> +\tstatic EventLoop *instance_;\n>  \n> +\tstruct event_base *event_;\n>  \tstd::atomic<bool> exit_;\n>  \tint exitCode_;\n\nIt might not have been introduced by this patch, but it seems to have\nbeen highlighted during this rebuild. Could you check if this is a real\nissue or a false positive please?\n\n\nIf you supply a patch to fix this issue, please add the following tag:\n\nReported-by: Coverity CID=305971\n\nAlternatively, if you believe it's a false positive, let me know and\nI'll close it.\n\n\n\nHi,\n\nPlease find the latest report on new defect(s) introduced to libcamera\nfound with Coverity Scan.\n\n1 new defect(s) introduced to libcamera found with Coverity Scan.\n1 defect(s), reported by Coverity Scan earlier, were marked fixed in the\nrecent build analyzed by Coverity Scan.\n\nNew defect(s) Reported-by: Coverity Scan\nShowing 1 of 1 defect(s)\n\n\n** CID 305971:  Uninitialized members  (UNINIT_CTOR)\n/home/linuxembedded/iob/libcamera/libcamera-daily/src/cam/event_loop.cpp: 23\nin EventLoop::EventLoop()()","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 08FFDBE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Nov 2020 11:52:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6BB81632C5;\n\tMon, 16 Nov 2020 12:52:54 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6B3CA631B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Nov 2020 12:52:50 +0100 (CET)","from [192.168.0.217]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E93F8A1B;\n\tMon, 16 Nov 2020 12:52:49 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"nxFkKjf9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605527570;\n\tbh=2ZlMoWK01FvKOH8V+CfpI4vQdG/yUPWUAZ5rIWEvVTU=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=nxFkKjf9L8VYNempXbVIxLNvch8Gjj8kBV5u5GtzD35Hon2W8qMB5qdJ5z0LRAaqj\n\t1gWiKlapGOiMN3ovC4roPKdMAt/3p7JYsmRBFCR2tUx4dlKkPrQ5usK798NLOh9Gmi\n\t00Ewu5kgLky8f82pz69VC+mDnBU4GL4sIfHgtclw=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\tmQINBFYE/WYBEACs1PwjMD9rgCu1hlIiUA1AXR4rv2v+BCLUq//vrX5S5bjzxKAryRf0uHat\n\tV/zwz6hiDrZuHUACDB7X8OaQcwhLaVlq6byfoBr25+hbZG7G3+5EUl9cQ7dQEdvNj6V6y/SC\n\trRanWfelwQThCHckbobWiQJfK9n7rYNcPMq9B8e9F020LFH7Kj6YmO95ewJGgLm+idg1Kb3C\n\tpotzWkXc1xmPzcQ1fvQMOfMwdS+4SNw4rY9f07Xb2K99rjMwZVDgESKIzhsDB5GY465sCsiQ\n\tcSAZRxqE49RTBq2+EQsbrQpIc8XiffAB8qexh5/QPzCmR4kJgCGeHIXBtgRj+nIkCJPZvZtf\n\tKr2EAbc6tgg6DkAEHJb+1okosV09+0+TXywYvtEop/WUOWQ+zo+Y/OBd+8Ptgt1pDRyOBzL8\n\tRXa8ZqRf0Mwg75D+dKntZeJHzPRJyrlfQokngAAs4PaFt6UfS+ypMAF37T6CeDArQC41V3ko\n\tlPn1yMsVD0p+6i3DPvA/GPIksDC4owjnzVX9kM8Zc5Cx+XoAN0w5Eqo4t6qEVbuettxx55gq\n\t8K8FieAjgjMSxngo/HST8TpFeqI5nVeq0/lqtBRQKumuIqDg+Bkr4L1V/PSB6XgQcOdhtd36\n\tOe9X9dXB8YSNt7VjOcO7BTmFn/Z8r92mSAfHXpb07YJWJosQOQARAQABtDBLaWVyYW4gQmlu\n\tZ2hhbSA8a2llcmFuLmJpbmdoYW1AaWRlYXNvbmJvYXJkLmNvbT6JAlcEEwEKAEECGwMFCwkI\n\tBwIGFQgJCgsCBBYCAwECHgECF4ACGQEWIQSQLdeYP70o/eNy1HqhHkZyEKRh/QUCXWTtygUJ\n\tCyJXZAAKCRChHkZyEKRh/f8dEACTDsbLN2nioNZMwyLuQRUAFcXNolDX48xcUXsWS2QjxaPm\n\tVsJx8Uy8aYkS85mdPBh0C83OovQR/OVbr8AxhGvYqBs3nQvbWuTl/+4od7DfK2VZOoKBAu5S\n\tQK2FYuUcikDqYcFWJ8DQnubxfE8dvzojHEkXw0sA4igINHDDFX3HJGZtLio+WpEFQtCbfTAG\n\tYZslasz1YZRbwEdSsmO3/kqy5eMnczlm8a21A3fKUo3g8oAZEFM+f4DUNzqIltg31OAB/kZS\n\tenKZQ/SWC8PmLg/ZXBrReYakxXtkP6w3FwMlzOlhGxqhIRNiAJfXJBaRhuUWzPOpEDE9q5YJ\n\tBmqQL2WJm1VSNNVxbXJHpaWMH1sA2R00vmvRrPXGwyIO0IPYeUYQa3gsy6k+En/aMQJd27dp\n\taScf9am9PFICPY5T4ppneeJLif2lyLojo0mcHOV+uyrds9XkLpp14GfTkeKPdPMrLLTsHRfH\n\tfA4I4OBpRrEPiGIZB/0im98MkGY/Mu6qxeZmYLCcgD6qz4idOvfgVOrNh+aA8HzIVR+RMW8H\n\tQGBN9f0E3kfwxuhl3omo6V7lDw8XOdmuWZNC9zPq1UfryVHANYbLGz9KJ4Aw6M+OgBC2JpkD\n\thXMdHUkC+d20dwXrwHTlrJi1YNp6rBc+xald3wsUPOZ5z8moTHUX/uPA/qhGsbkCDQRWBP1m\n\tARAAzijkb+Sau4hAncr1JjOY+KyFEdUNxRy+hqTJdJfaYihxyaj0Ee0P0zEi35CbE6lgU0Uz\n\ttih9fiUbSV3wfsWqg1Ut3/5rTKu7kLFp15kF7eqvV4uezXRD3Qu4yjv/rMmEJbbD4cTvGCYI\n\td6MDC417f7vK3hCbCVIZSp3GXxyC1LU+UQr3fFcOyCwmP9vDUR9JV0BSqHHxRDdpUXE26Dk6\n\tmhf0V1YkspE5St814ETXpEus2urZE5yJIUROlWPIL+hm3NEWfAP06vsQUyLvr/GtbOT79vXl\n\tEn1aulcYyu20dRRxhkQ6iILaURcxIAVJJKPi8dsoMnS8pB0QW12AHWuirPF0g6DiuUfPmrA5\n\tPKe56IGlpkjc8cO51lIxHkWTpCMWigRdPDexKX+Sb+W9QWK/0JjIc4t3KBaiG8O4yRX8ml2R\n\t+rxfAVKM6V769P/hWoRGdgUMgYHFpHGSgEt80OKK5HeUPy2cngDUXzwrqiM5Sz6Od0qw5pCk\n\tNlXqI0W/who0iSVM+8+RmyY0OEkxEcci7rRLsGnM15B5PjLJjh1f2ULYkv8s4SnDwMZ/kE04\n\t/UqCMK/KnX8pwXEMCjz0h6qWNpGwJ0/tYIgQJZh6bqkvBrDogAvuhf60Sogw+mH8b+PBlx1L\n\toeTK396wc+4c3BfiC6pNtUS5GpsPMMjYMk7kVvEAEQEAAYkCPAQYAQoAJgIbDBYhBJAt15g/\n\tvSj943LUeqEeRnIQpGH9BQJdizzIBQkLSKZiAAoJEKEeRnIQpGH9eYgQAJpjaWNgqNOnMTmD\n\tMJggbwjIotypzIXfhHNCeTkG7+qCDlSaBPclcPGYrTwCt0YWPU2TgGgJrVhYT20ierN8LUvj\n\t6qOPTd+Uk7NFzL65qkh80ZKNBFddx1AabQpSVQKbdcLb8OFs85kuSvFdgqZwgxA1vl4TFhNz\n\tPZ79NAmXLackAx3sOVFhk4WQaKRshCB7cSl+RIng5S/ThOBlwNlcKG7j7W2MC06BlTbdEkUp\n\tECzuuRBv8wX4OQl+hbWbB/VKIx5HKlLu1eypen/5lNVzSqMMIYkkZcjV2SWQyUGxSwq0O/sx\n\tS0A8/atCHUXOboUsn54qdxrVDaK+6jIAuo8JiRWctP16KjzUM7MO0/+4zllM8EY57rXrj48j\n\tsbEYX0YQnzaj+jO6kJtoZsIaYR7rMMq9aUAjyiaEZpmP1qF/2sYenDx0Fg2BSlLvLvXM0vU8\n\tpQk3kgDu7kb/7PRYrZvBsr21EIQoIjXbZxDz/o7z95frkP71EaICttZ6k9q5oxxA5WC6sTXc\n\tMW8zs8avFNuA9VpXt0YupJd2ijtZy2mpZNG02fFVXhIn4G807G7+9mhuC4XG5rKlBBUXTvPU\n\tAfYnB4JBDLmLzBFavQfvonSfbitgXwCG3vS+9HEwAjU30Bar1PEOmIbiAoMzuKeRm2LVpmq4\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<8706d2a7-1345-cfdf-28a5-e5b812b2ac6c@ideasonboard.com>","Date":"Mon, 16 Nov 2020 11:52:47 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Reply-To":"kieran.bingham@ideasonboard.com","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13726,"web_url":"https://patchwork.libcamera.org/comment/13726/","msgid":"<20201116145208.GL6540@pendragon.ideasonboard.com>","date":"2020-11-16T14:52:08","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Mon, Nov 16, 2020 at 11:52:47AM +0000, Kieran Bingham wrote:\n> On 13/11/2020 06:38, Laurent Pinchart wrote:\n> > To prepare for removal of the EventDispatcher from the libcamera public\n> > API, switch to libevent to handle the event loop.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/cam/event_loop.cpp | 34 +++++++++++++++++++++++++++-------\n> >  src/cam/event_loop.h   | 15 ++++++++-------\n> >  src/cam/main.cpp       | 16 +++++-----------\n> >  src/cam/meson.build    | 13 ++++++++++++-\n> >  4 files changed, 52 insertions(+), 26 deletions(-)\n> > \n> > diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\n> > index e8ab861790ed..13f2583da0a1 100644\n> > --- a/src/cam/event_loop.cpp\n> > +++ b/src/cam/event_loop.cpp\n> > @@ -5,19 +5,34 @@\n> >   * event_loop.cpp - cam - Event loop\n> >   */\n> >  \n> > -#include <libcamera/event_dispatcher.h>\n> > -\n> >  #include \"event_loop.h\"\n> >  \n> > -using namespace libcamera;\n> > +#include <assert.h>\n> > +#include <event2/event.h>\n> > +#include <event2/thread.h>\n> >  \n> > -EventLoop::EventLoop(EventDispatcher *dispatcher)\n> > -\t: dispatcher_(dispatcher)\n> > +EventLoop *EventLoop::instance_ = nullptr;\n> > +\n> > +EventLoop::EventLoop()\n> >  {\n> > +\tassert(!instance_);\n> > +\n> > +\tevthread_use_pthreads();\n> > +\tevent_ = event_base_new();\n> > +\tinstance_ = this;\n> >  }\n> >  \n> >  EventLoop::~EventLoop()\n> >  {\n> > +\tinstance_ = nullptr;\n> > +\n> > +\tevent_base_free(event_);\n> > +\tlibevent_global_shutdown();\n> > +}\n> > +\n> > +EventLoop *EventLoop::instance()\n> > +{\n> > +\treturn instance_;\n> >  }\n> >  \n> >  int EventLoop::exec()\n> > @@ -26,7 +41,7 @@ int EventLoop::exec()\n> >  \texit_.store(false, std::memory_order_release);\n> >  \n> >  \twhile (!exit_.load(std::memory_order_acquire))\n> > -\t\tdispatcher_->processEvents();\n> > +\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n> >  \n> >  \treturn exitCode_;\n> >  }\n> > @@ -35,5 +50,10 @@ void EventLoop::exit(int code)\n> >  {\n> >  \texitCode_ = code;\n> >  \texit_.store(true, std::memory_order_release);\n> > -\tdispatcher_->interrupt();\n> > +\tinterrupt();\n> > +}\n> > +\n> > +void EventLoop::interrupt()\n> > +{\n> > +\tevent_base_loopbreak(event_);\n> >  }\n> > diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\n> > index 581c7cba2fc4..b1c6bd103080 100644\n> > --- a/src/cam/event_loop.h\n> > +++ b/src/cam/event_loop.h\n> > @@ -9,26 +9,27 @@\n> >  \n> >  #include <atomic>\n> >  \n> > -#include <libcamera/event_notifier.h>\n> > -\n> > -namespace libcamera {\n> > -class EventDispatcher;\n> > -}\n> > +struct event_base;\n> >  \n> >  class EventLoop\n> >  {\n> >  public:\n> > -\tEventLoop(libcamera::EventDispatcher *dispatcher);\n> > +\tEventLoop();\n> >  \t~EventLoop();\n> >  \n> > +\tstatic EventLoop *instance();\n> > +\n> >  \tint exec();\n> >  \tvoid exit(int code = 0);\n> >  \n> >  private:\n> > -\tlibcamera::EventDispatcher *dispatcher_;\n> > +\tstatic EventLoop *instance_;\n> >  \n> > +\tstruct event_base *event_;\n> >  \tstd::atomic<bool> exit_;\n> >  \tint exitCode_;\n> \n> It might not have been introduced by this patch, but it seems to have\n> been highlighted during this rebuild. Could you check if this is a real\n> issue or a false positive please?\n> \n> \n> If you supply a patch to fix this issue, please add the following tag:\n> \n> Reported-by: Coverity CID=305971\n> \n> Alternatively, if you believe it's a false positive, let me know and\n> I'll close it.\n\nI've noticed the report. The diagnostic is right, exitCode_ is not\ninitialized in the constructor, but that's not an issue as it's\ninitialized in all code paths that may potentially use it.\n\n> Hi,\n> \n> Please find the latest report on new defect(s) introduced to libcamera\n> found with Coverity Scan.\n> \n> 1 new defect(s) introduced to libcamera found with Coverity Scan.\n> 1 defect(s), reported by Coverity Scan earlier, were marked fixed in the\n> recent build analyzed by Coverity Scan.\n> \n> New defect(s) Reported-by: Coverity Scan\n> Showing 1 of 1 defect(s)\n> \n> \n> ** CID 305971:  Uninitialized members  (UNINIT_CTOR)\n> /home/linuxembedded/iob/libcamera/libcamera-daily/src/cam/event_loop.cpp: 23\n> in EventLoop::EventLoop()()\n> \n> \n> ________________________________________________________________________________________________________\n> *** CID 305971:  Uninitialized members  (UNINIT_CTOR)\n> /home/linuxembedded/iob/libcamera/libcamera-daily/src/cam/event_loop.cpp: 23\n> in EventLoop::EventLoop()()\n> 17     {\n> 18     \tassert(!instance_);\n> 19\n> 20     \tevthread_use_pthreads();\n> 21     \tevent_ = event_base_new();\n> 22     \tinstance_ = this;\n> >>>     CID 305971:  Uninitialized members  (UNINIT_CTOR)\n> >>>     Non-static class member \"exitCode_\" is not initialized in this\n> constructor nor in any functions that it calls.\n> 23     }\n> 24\n> 25     EventLoop::~EventLoop()\n> 26     {\n> 27     \tinstance_ = nullptr;\n> 28\n> \n> > +\n> > +\tvoid interrupt();\n> >  };\n> >  \n> >  #endif /* __CAM_EVENT_LOOP_H__ */\n> > diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> > index b3a8d94f5739..e01be63a7058 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -52,7 +52,7 @@ private:\n> >  \tCameraManager *cm_;\n> >  \tstd::shared_ptr<Camera> camera_;\n> >  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> > -\tEventLoop *loop_;\n> > +\tEventLoop loop_;\n> >  \n> >  \tbool strictFormats_;\n> >  };\n> > @@ -60,7 +60,7 @@ private:\n> >  CamApp *CamApp::app_ = nullptr;\n> >  \n> >  CamApp::CamApp()\n> > -\t: cm_(nullptr), camera_(nullptr), config_(nullptr), loop_(nullptr),\n> > +\t: cm_(nullptr), camera_(nullptr), config_(nullptr),\n> >  \t  strictFormats_(false)\n> >  {\n> >  \tCamApp::app_ = this;\n> > @@ -134,16 +134,11 @@ int CamApp::init(int argc, char **argv)\n> >  \t\tstd::cout << \"Monitoring new hotplug and unplug events\" << std::endl;\n> >  \t}\n> >  \n> > -\tloop_ = new EventLoop(cm_->eventDispatcher());\n> > -\n> >  \treturn 0;\n> >  }\n> >  \n> >  void CamApp::cleanup()\n> >  {\n> > -\tdelete loop_;\n> > -\tloop_ = nullptr;\n> > -\n> >  \tif (camera_) {\n> >  \t\tcamera_->release();\n> >  \t\tcamera_.reset();\n> > @@ -166,8 +161,7 @@ int CamApp::exec()\n> >  \n> >  void CamApp::quit()\n> >  {\n> > -\tif (loop_)\n> > -\t\tloop_->exit();\n> > +\tloop_.exit();\n> >  }\n> >  \n> >  int CamApp::parseOptions(int argc, char *argv[])\n> > @@ -366,13 +360,13 @@ int CamApp::run()\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptCapture)) {\n> > -\t\tCapture capture(camera_, config_.get(), loop_);\n> > +\t\tCapture capture(camera_, config_.get(), &loop_);\n> >  \t\treturn capture.run(options_);\n> >  \t}\n> >  \n> >  \tif (options_.isSet(OptMonitor)) {\n> >  \t\tstd::cout << \"Press Ctrl-C to interrupt\" << std::endl;\n> > -\t\tret = loop_->exec();\n> > +\t\tret = loop_.exec();\n> >  \t\tif (ret)\n> >  \t\t\tstd::cout << \"Failed to run monitor loop\" << std::endl;\n> >  \t}\n> > diff --git a/src/cam/meson.build b/src/cam/meson.build\n> > index 89e124fbae2a..62003c58dad0 100644\n> > --- a/src/cam/meson.build\n> > +++ b/src/cam/meson.build\n> > @@ -1,5 +1,12 @@\n> >  # SPDX-License-Identifier: CC0-1.0\n> >  \n> > +libevent = dependency('libevent_pthreads', required : false)\n> > +\n> > +if not libevent.found()\n> > +    warning('libevent_pthreads not found,\\'cam\\' application will not be compiled')\n> > +    subdir_done()\n> > +endif\n> > +\n> >  cam_sources = files([\n> >      'buffer_writer.cpp',\n> >      'capture.cpp',\n> > @@ -10,5 +17,9 @@ cam_sources = files([\n> >  ])\n> >  \n> >  cam  = executable('cam', cam_sources,\n> > -                  dependencies : [ libatomic, libcamera_dep ],\n> > +                  dependencies : [\n> > +                      libatomic,\n> > +                      libcamera_dep,\n> > +                      libevent,\n> > +                  ],\n> >                    install : true)\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id B2B30BE081\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Nov 2020 14:52:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0FD1C632C3;\n\tMon, 16 Nov 2020 15:52:14 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3C818631B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Nov 2020 15:52:13 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AD7FDA1B;\n\tMon, 16 Nov 2020 15:52:12 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"FIfVI2xC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605538332;\n\tbh=gtfMQOGnZQlV/v4BDbIaMW2HFL+DHQcoXrt/Bfxaz1Q=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=FIfVI2xCKZnBWzz0GTlZEAEbF/hakdIWxDdBsKvKW9fezKozLv/U67EvbyFKAVw+q\n\teDVMwMzSHVC6+ckDGbq9EThyB9RNePID5Aeo7WQqyOa/AIuXm4r4O2t20yJVFvxUlg\n\tqtN09sNa+ftrSt+eHuNmSzZHsM0RgTobE8OkIdpg=","Date":"Mon, 16 Nov 2020 16:52:08 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201116145208.GL6540@pendragon.ideasonboard.com>","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>\n\t<8706d2a7-1345-cfdf-28a5-e5b812b2ac6c@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<8706d2a7-1345-cfdf-28a5-e5b812b2ac6c@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13740,"web_url":"https://patchwork.libcamera.org/comment/13740/","msgid":"<1df80a83-84b1-3814-e165-28cef44e0f42@ideasonboard.com>","date":"2020-11-17T11:05:52","subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 16/11/2020 14:52, Laurent Pinchart wrote:\n> Hi Kieran,\n>>>  \n>>> +\tstruct event_base *event_;\n>>>  \tstd::atomic<bool> exit_;\n>>>  \tint exitCode_;\n>>\n>> It might not have been introduced by this patch, but it seems to have\n>> been highlighted during this rebuild. Could you check if this is a real\n>> issue or a false positive please?\n>>\n>>\n>> If you supply a patch to fix this issue, please add the following tag:\n>>\n>> Reported-by: Coverity CID=305971\n>>\n>> Alternatively, if you believe it's a false positive, let me know and\n>> I'll close it.\n> \n> I've noticed the report. The diagnostic is right, exitCode_ is not\n> initialized in the constructor, but that's not an issue as it's\n> initialized in all code paths that may potentially use it.\n\nThat's fine, I've closed this one.\n\nThanks\n--\nKieran\n\n\n\n> \n>> Hi,\n>>\n>> Please find the latest report on new defect(s) introduced to libcamera\n>> found with Coverity Scan.\n>>\n>> 1 new defect(s) introduced to libcamera found with Coverity Scan.\n>> 1 defect(s), reported by Coverity Scan earlier, were marked fixed in the\n>> recent build analyzed by Coverity Scan.\n>>\n>> New defect(s) Reported-by: Coverity Scan\n>> Showing 1 of 1 defect(s)\n>>\n>>\n>> ** CID 305971:  Uninitialized members  (UNINIT_CTOR)\n>> /home/linuxembedded/iob/libcamera/libcamera-daily/src/cam/event_loop.cpp: 23\n>> in EventLoop::EventLoop()()\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3882CBE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 Nov 2020 11:05:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C776C632B4;\n\tTue, 17 Nov 2020 12:05:58 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1664C6033B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Nov 2020 12:05:57 +0100 (CET)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 88835563;\n\tTue, 17 Nov 2020 12:05:56 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"gOFGDbd+\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1605611156;\n\tbh=i97uXZKdzbEvfoU8SO+4OzfrjLiiK9mPc2brpNElpp8=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=gOFGDbd+vQUqJsPx7zFMJnyel4TPTFQ7dtIoaPolM3ooRQ+roUk7mbJp9zAqfBIzj\n\t8iZcHQoZXum+0C1YBPgrmhz57PxCfJC7BeyXIPgy2yJ0fbsqzY5H9RLgebVhPq8vJT\n\tIjZHAOZDdNXWSflT8wRaxporsYrCuCAcKI0yMgVQ=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20201113063815.10288-1-laurent.pinchart@ideasonboard.com>\n\t<20201113063815.10288-3-laurent.pinchart@ideasonboard.com>\n\t<8706d2a7-1345-cfdf-28a5-e5b812b2ac6c@ideasonboard.com>\n\t<20201116145208.GL6540@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<1df80a83-84b1-3814-e165-28cef44e0f42@ideasonboard.com>","Date":"Tue, 17 Nov 2020 11:05:52 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201116145208.GL6540@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v1 2/5] cam: Use libevent to implement\n\tevent loop","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]