[{"id":17494,"web_url":"https://patchwork.libcamera.org/comment/17494/","msgid":"<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>","date":"2021-06-09T16:34:28","subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Nicolas,\n\nOn Mon, Jun 07, 2021 at 03:15:03PM -0300, Nícolas F. R. A. Prado wrote:\n> Make SimpleCapture::stop() be able to be called multiple times and at\n> any point so that it can be called from the destructor and an assert\n> failure can return immediately.\n>\n> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> No changes in v6\n>\n> No changes in v5\n>\n> No changes in v4\n>\n> No changes in v3\n>\n> Changes in v2:\n> - Suggested by Laurent:\n>   - Fixed code style\n>\n>  src/lc-compliance/simple_capture.cpp | 33 +++++++++++-----------------\n>  1 file changed, 13 insertions(+), 20 deletions(-)\n>\n> diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp\n> index 64e862a08e3a..f90fe6d0f9aa 100644\n> --- a/src/lc-compliance/simple_capture.cpp\n> +++ b/src/lc-compliance/simple_capture.cpp\n> @@ -17,6 +17,7 @@ SimpleCapture::SimpleCapture(std::shared_ptr<Camera> camera)\n>\n>  SimpleCapture::~SimpleCapture()\n>  {\n> +\tstop();\n>  }\n>\n>  Results::Result SimpleCapture::configure(StreamRole role)\n> @@ -55,12 +56,17 @@ Results::Result SimpleCapture::start()\n>\n>  void SimpleCapture::stop()\n>  {\n> -\tStream *stream = config_->at(0).stream();\n> +\tif (!config_)\n> +\t\treturn;\n>\n>  \tcamera_->stop();\n>\n>  \tcamera_->requestCompleted.disconnect(this, &SimpleCapture::requestComplete);\n\nnit: I think these two can be moved after the allocator_->allocated() check\nbelow as in start()\n\n\tASSERT_GE(allocator_->allocate(stream), 0) << \"Failed to allocate buffers\";\n\n\tASSERT_TRUE(!camera_->start()) << \"Failed to start camera\";\n\n\tcamera_->requestCompleted.connect(this, &SimpleCapture::requestComplete);\n\nI would also respect the inverse order and disconnect the signal\nfirst, then stop the camera.\n\nAll minors\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n\n>\n> +\tif (!allocator_->allocated())\n> +\t\treturn;\n> +\n> +\tStream *stream = config_->at(0).stream();\n>  \tallocator_->free(stream);\n>  }\n>\n> @@ -84,7 +90,6 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n>  \tif (buffers.size() > numRequests) {\n>  \t\t/* Cache buffers.size() before we destroy it in stop() */\n>  \t\tint buffers_size = buffers.size();\n> -\t\tstop();\n>\n>  \t\treturn { Results::Skip, \"Camera needs \" + std::to_string(buffers_size)\n>  \t\t\t+ \" requests, can't test only \" + std::to_string(numRequests) };\n> @@ -98,20 +103,14 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n>  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n>  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n>  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> -\t\tif (!request) {\n> -\t\t\tstop();\n> +\t\tif (!request)\n>  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> -\t\t}\n>\n> -\t\tif (request->addBuffer(stream, buffer.get())) {\n> -\t\t\tstop();\n> +\t\tif (request->addBuffer(stream, buffer.get()))\n>  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> -\t\t}\n>\n> -\t\tif (queueRequest(request.get()) < 0) {\n> -\t\t\tstop();\n> +\t\tif (queueRequest(request.get()) < 0)\n>  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> -\t\t}\n>\n>  \t\trequests.push_back(std::move(request));\n>  \t}\n> @@ -175,20 +174,14 @@ Results::Result SimpleCaptureUnbalanced::capture(unsigned int numRequests)\n>  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n>  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n>  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> -\t\tif (!request) {\n> -\t\t\tstop();\n> +\t\tif (!request)\n>  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> -\t\t}\n>\n> -\t\tif (request->addBuffer(stream, buffer.get())) {\n> -\t\t\tstop();\n> +\t\tif (request->addBuffer(stream, buffer.get()))\n>  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> -\t\t}\n>\n> -\t\tif (camera_->queueRequest(request.get()) < 0) {\n> -\t\t\tstop();\n> +\t\tif (camera_->queueRequest(request.get()) < 0)\n>  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> -\t\t}\n>\n>  \t\trequests.push_back(std::move(request));\n>  \t}\n> --\n> 2.31.1\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 3197AC320B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  9 Jun 2021 16:33:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 641626892F;\n\tWed,  9 Jun 2021 18:33:41 +0200 (CEST)","from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 87C98602A0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  9 Jun 2021 18:33:39 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id C479B40005;\n\tWed,  9 Jun 2021 16:33:38 +0000 (UTC)"],"Date":"Wed, 9 Jun 2021 18:34:28 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>","References":"<20210607181506.51711-1-nfraprado@collabora.com>\n\t<20210607181506.51711-3-nfraprado@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210607181506.51711-3-nfraprado@collabora.com>","Subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","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, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17498,"web_url":"https://patchwork.libcamera.org/comment/17498/","msgid":"<20210609195701.h42fmakx3jaozybf@notapiano>","date":"2021-06-09T19:57:01","subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","submitter":{"id":84,"url":"https://patchwork.libcamera.org/api/people/84/","name":"Nícolas F. R. A. Prado","email":"nfraprado@collabora.com"},"content":"Hi Jacopo,\n\nOn Wed, Jun 09, 2021 at 06:34:28PM +0200, Jacopo Mondi wrote:\n> Hi Nicolas,\n> \n> On Mon, Jun 07, 2021 at 03:15:03PM -0300, Nícolas F. R. A. Prado wrote:\n> > Make SimpleCapture::stop() be able to be called multiple times and at\n> > any point so that it can be called from the destructor and an assert\n> > failure can return immediately.\n> >\n> > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > No changes in v6\n> >\n> > No changes in v5\n> >\n> > No changes in v4\n> >\n> > No changes in v3\n> >\n> > Changes in v2:\n> > - Suggested by Laurent:\n> >   - Fixed code style\n> >\n> >  src/lc-compliance/simple_capture.cpp | 33 +++++++++++-----------------\n> >  1 file changed, 13 insertions(+), 20 deletions(-)\n> >\n> > diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp\n> > index 64e862a08e3a..f90fe6d0f9aa 100644\n> > --- a/src/lc-compliance/simple_capture.cpp\n> > +++ b/src/lc-compliance/simple_capture.cpp\n> > @@ -17,6 +17,7 @@ SimpleCapture::SimpleCapture(std::shared_ptr<Camera> camera)\n> >\n> >  SimpleCapture::~SimpleCapture()\n> >  {\n> > +\tstop();\n> >  }\n> >\n> >  Results::Result SimpleCapture::configure(StreamRole role)\n> > @@ -55,12 +56,17 @@ Results::Result SimpleCapture::start()\n> >\n> >  void SimpleCapture::stop()\n> >  {\n> > -\tStream *stream = config_->at(0).stream();\n> > +\tif (!config_)\n> > +\t\treturn;\n> >\n> >  \tcamera_->stop();\n> >\n> >  \tcamera_->requestCompleted.disconnect(this, &SimpleCapture::requestComplete);\n> \n> nit: I think these two can be moved after the allocator_->allocated() check\n> below as in start()\n> \n> \tASSERT_GE(allocator_->allocate(stream), 0) << \"Failed to allocate buffers\";\n> \n> \tASSERT_TRUE(!camera_->start()) << \"Failed to start camera\";\n> \n> \tcamera_->requestCompleted.connect(this, &SimpleCapture::requestComplete);\n\nRight, makes sense. In that case I'll join both checks for config_ and\nallocator_->allocated() in a single if at the beginning of the function.\n\n> \n> I would also respect the inverse order and disconnect the signal\n> first, then stop the camera.\n\nOkay. So I suppose it won't cause any issues if requests complete after we\ndisconnect the signal.\n\n> \n> All minors\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks :)\n\nNícolas\n\n> \n> Thanks\n>    j\n> \n> >\n> > +\tif (!allocator_->allocated())\n> > +\t\treturn;\n> > +\n> > +\tStream *stream = config_->at(0).stream();\n> >  \tallocator_->free(stream);\n> >  }\n> >\n> > @@ -84,7 +90,6 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> >  \tif (buffers.size() > numRequests) {\n> >  \t\t/* Cache buffers.size() before we destroy it in stop() */\n> >  \t\tint buffers_size = buffers.size();\n> > -\t\tstop();\n> >\n> >  \t\treturn { Results::Skip, \"Camera needs \" + std::to_string(buffers_size)\n> >  \t\t\t+ \" requests, can't test only \" + std::to_string(numRequests) };\n> > @@ -98,20 +103,14 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > -\t\tif (!request) {\n> > -\t\t\tstop();\n> > +\t\tif (!request)\n> >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > -\t\t}\n> >\n> > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > -\t\t\tstop();\n> > +\t\tif (request->addBuffer(stream, buffer.get()))\n> >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > -\t\t}\n> >\n> > -\t\tif (queueRequest(request.get()) < 0) {\n> > -\t\t\tstop();\n> > +\t\tif (queueRequest(request.get()) < 0)\n> >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > -\t\t}\n> >\n> >  \t\trequests.push_back(std::move(request));\n> >  \t}\n> > @@ -175,20 +174,14 @@ Results::Result SimpleCaptureUnbalanced::capture(unsigned int numRequests)\n> >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > -\t\tif (!request) {\n> > -\t\t\tstop();\n> > +\t\tif (!request)\n> >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > -\t\t}\n> >\n> > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > -\t\t\tstop();\n> > +\t\tif (request->addBuffer(stream, buffer.get()))\n> >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > -\t\t}\n> >\n> > -\t\tif (camera_->queueRequest(request.get()) < 0) {\n> > -\t\t\tstop();\n> > +\t\tif (camera_->queueRequest(request.get()) < 0)\n> >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > -\t\t}\n> >\n> >  \t\trequests.push_back(std::move(request));\n> >  \t}\n> > --\n> > 2.31.1\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 9EBFDC320B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  9 Jun 2021 19:57:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 147BA68928;\n\tWed,  9 Jun 2021 21:57:49 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 83A6768922\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  9 Jun 2021 21:57:47 +0200 (CEST)","from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nfraprado) with ESMTPSA id D7E131F436FD"],"Date":"Wed, 9 Jun 2021 16:57:01 -0300","From":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20210609195701.h42fmakx3jaozybf@notapiano>","References":"<20210607181506.51711-1-nfraprado@collabora.com>\n\t<20210607181506.51711-3-nfraprado@collabora.com>\n\t<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","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, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17504,"web_url":"https://patchwork.libcamera.org/comment/17504/","msgid":"<YMFtwH2FtvZixM/D@pendragon.ideasonboard.com>","date":"2021-06-10T01:41:20","subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello,\n\nOn Wed, Jun 09, 2021 at 04:57:01PM -0300, Nícolas F. R. A. Prado wrote:\n> On Wed, Jun 09, 2021 at 06:34:28PM +0200, Jacopo Mondi wrote:\n> > On Mon, Jun 07, 2021 at 03:15:03PM -0300, Nícolas F. R. A. Prado wrote:\n> > > Make SimpleCapture::stop() be able to be called multiple times and at\n> > > any point so that it can be called from the destructor and an assert\n> > > failure can return immediately.\n> > >\n> > > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > > ---\n> > > No changes in v6\n> > >\n> > > No changes in v5\n> > >\n> > > No changes in v4\n> > >\n> > > No changes in v3\n> > >\n> > > Changes in v2:\n> > > - Suggested by Laurent:\n> > >   - Fixed code style\n> > >\n> > >  src/lc-compliance/simple_capture.cpp | 33 +++++++++++-----------------\n> > >  1 file changed, 13 insertions(+), 20 deletions(-)\n> > >\n> > > diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp\n> > > index 64e862a08e3a..f90fe6d0f9aa 100644\n> > > --- a/src/lc-compliance/simple_capture.cpp\n> > > +++ b/src/lc-compliance/simple_capture.cpp\n> > > @@ -17,6 +17,7 @@ SimpleCapture::SimpleCapture(std::shared_ptr<Camera> camera)\n> > >\n> > >  SimpleCapture::~SimpleCapture()\n> > >  {\n> > > +\tstop();\n> > >  }\n> > >\n> > >  Results::Result SimpleCapture::configure(StreamRole role)\n> > > @@ -55,12 +56,17 @@ Results::Result SimpleCapture::start()\n> > >\n> > >  void SimpleCapture::stop()\n> > >  {\n> > > -\tStream *stream = config_->at(0).stream();\n> > > +\tif (!config_)\n> > > +\t\treturn;\n> > >\n> > >  \tcamera_->stop();\n> > >\n> > >  \tcamera_->requestCompleted.disconnect(this, &SimpleCapture::requestComplete);\n> > \n> > nit: I think these two can be moved after the allocator_->allocated() check\n> > below as in start()\n> > \n> > \tASSERT_GE(allocator_->allocate(stream), 0) << \"Failed to allocate buffers\";\n> > \n> > \tASSERT_TRUE(!camera_->start()) << \"Failed to start camera\";\n> > \n> > \tcamera_->requestCompleted.connect(this, &SimpleCapture::requestComplete);\n> \n> Right, makes sense. In that case I'll join both checks for config_ and\n> allocator_->allocated() in a single if at the beginning of the function.\n> \n> > I would also respect the inverse order and disconnect the signal\n> > first, then stop the camera.\n> \n> Okay. So I suppose it won't cause any issues if requests complete after we\n> disconnect the signal.\n\nIt could result in memory leaks, so I wouldn't do so.\n\n> > All minors\n> > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> Thanks :)\n> \n> > > +\tif (!allocator_->allocated())\n> > > +\t\treturn;\n> > > +\n> > > +\tStream *stream = config_->at(0).stream();\n> > >  \tallocator_->free(stream);\n> > >  }\n> > >\n> > > @@ -84,7 +90,6 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> > >  \tif (buffers.size() > numRequests) {\n> > >  \t\t/* Cache buffers.size() before we destroy it in stop() */\n> > >  \t\tint buffers_size = buffers.size();\n> > > -\t\tstop();\n> > >\n> > >  \t\treturn { Results::Skip, \"Camera needs \" + std::to_string(buffers_size)\n> > >  \t\t\t+ \" requests, can't test only \" + std::to_string(numRequests) };\n> > > @@ -98,20 +103,14 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> > >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> > >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> > >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > > -\t\tif (!request) {\n> > > -\t\t\tstop();\n> > > +\t\tif (!request)\n> > >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > > -\t\t}\n> > >\n> > > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > > -\t\t\tstop();\n> > > +\t\tif (request->addBuffer(stream, buffer.get()))\n> > >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > > -\t\t}\n> > >\n> > > -\t\tif (queueRequest(request.get()) < 0) {\n> > > -\t\t\tstop();\n> > > +\t\tif (queueRequest(request.get()) < 0)\n> > >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > > -\t\t}\n> > >\n> > >  \t\trequests.push_back(std::move(request));\n> > >  \t}\n> > > @@ -175,20 +174,14 @@ Results::Result SimpleCaptureUnbalanced::capture(unsigned int numRequests)\n> > >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> > >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> > >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > > -\t\tif (!request) {\n> > > -\t\t\tstop();\n> > > +\t\tif (!request)\n> > >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > > -\t\t}\n> > >\n> > > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > > -\t\t\tstop();\n> > > +\t\tif (request->addBuffer(stream, buffer.get()))\n> > >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > > -\t\t}\n> > >\n> > > -\t\tif (camera_->queueRequest(request.get()) < 0) {\n> > > -\t\t\tstop();\n> > > +\t\tif (camera_->queueRequest(request.get()) < 0)\n> > >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > > -\t\t}\n> > >\n> > >  \t\trequests.push_back(std::move(request));\n> > >  \t}","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 B3FBDBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 10 Jun 2021 01:41:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E8E1E68926;\n\tThu, 10 Jun 2021 03:41:40 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9ED5E602A0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Jun 2021 03:41:39 +0200 (CEST)","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 20F888A2;\n\tThu, 10 Jun 2021 03:41:39 +0200 (CEST)"],"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=\"X/hdnw8y\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1623289299;\n\tbh=Rc5ymR7tpxdlWeTF1cBrb6nwIEzwRWRsZZ4EAeWtEDw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=X/hdnw8ymNDu4J1cat5ZISzCk2nP6Rzs39dxnbYkGK50Q8IxypqwGjUivPICjfMQF\n\tg3FacFsfo1q3/6rBAO9hhMfNjQE9+HebxkSQQVrWtRZZDmfc2GOedSWbInSU2mO809\n\tK0Rvh9ycjixRe8efMxC3e7moEO/Sg3xbcZAoxLF8=","Date":"Thu, 10 Jun 2021 04:41:20 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<YMFtwH2FtvZixM/D@pendragon.ideasonboard.com>","References":"<20210607181506.51711-1-nfraprado@collabora.com>\n\t<20210607181506.51711-3-nfraprado@collabora.com>\n\t<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>\n\t<20210609195701.h42fmakx3jaozybf@notapiano>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210609195701.h42fmakx3jaozybf@notapiano>","Subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","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, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17505,"web_url":"https://patchwork.libcamera.org/comment/17505/","msgid":"<20210610074904.6zwzpg5dfwtlujza@uno.localdomain>","date":"2021-06-10T07:49:04","subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hello,\n\nOn Thu, Jun 10, 2021 at 04:41:20AM +0300, Laurent Pinchart wrote:\n> Hello,\n>\n> > Right, makes sense. In that case I'll join both checks for config_ and\n> > allocator_->allocated() in a single if at the beginning of the function.\n> >\n> > > I would also respect the inverse order and disconnect the signal\n> > > first, then stop the camera.\n> >\n> > Okay. So I suppose it won't cause any issues if requests complete after we\n> > disconnect the signal.\n>\n> It could result in memory leaks, so I wouldn't do so.\n>\n\nYeah indeed, please ignore my comment then :)\n\n> > > All minors\n> > > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> >\n> > Thanks :)\n> >\n> > > > +\tif (!allocator_->allocated())\n> > > > +\t\treturn;\n> > > > +\n> > > > +\tStream *stream = config_->at(0).stream();\n> > > >  \tallocator_->free(stream);\n> > > >  }\n> > > >\n> > > > @@ -84,7 +90,6 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> > > >  \tif (buffers.size() > numRequests) {\n> > > >  \t\t/* Cache buffers.size() before we destroy it in stop() */\n> > > >  \t\tint buffers_size = buffers.size();\n> > > > -\t\tstop();\n> > > >\n> > > >  \t\treturn { Results::Skip, \"Camera needs \" + std::to_string(buffers_size)\n> > > >  \t\t\t+ \" requests, can't test only \" + std::to_string(numRequests) };\n> > > > @@ -98,20 +103,14 @@ Results::Result SimpleCaptureBalanced::capture(unsigned int numRequests)\n> > > >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> > > >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> > > >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > > > -\t\tif (!request) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (!request)\n> > > >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > > > -\t\t}\n> > > >\n> > > > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (request->addBuffer(stream, buffer.get()))\n> > > >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > > > -\t\t}\n> > > >\n> > > > -\t\tif (queueRequest(request.get()) < 0) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (queueRequest(request.get()) < 0)\n> > > >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > > > -\t\t}\n> > > >\n> > > >  \t\trequests.push_back(std::move(request));\n> > > >  \t}\n> > > > @@ -175,20 +174,14 @@ Results::Result SimpleCaptureUnbalanced::capture(unsigned int numRequests)\n> > > >  \tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n> > > >  \tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n> > > >  \t\tstd::unique_ptr<Request> request = camera_->createRequest();\n> > > > -\t\tif (!request) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (!request)\n> > > >  \t\t\treturn { Results::Fail, \"Can't create request\" };\n> > > > -\t\t}\n> > > >\n> > > > -\t\tif (request->addBuffer(stream, buffer.get())) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (request->addBuffer(stream, buffer.get()))\n> > > >  \t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n> > > > -\t\t}\n> > > >\n> > > > -\t\tif (camera_->queueRequest(request.get()) < 0) {\n> > > > -\t\t\tstop();\n> > > > +\t\tif (camera_->queueRequest(request.get()) < 0)\n> > > >  \t\t\treturn { Results::Fail, \"Failed to queue request\" };\n> > > > -\t\t}\n> > > >\n> > > >  \t\trequests.push_back(std::move(request));\n> > > >  \t}\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","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 D164EC320B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 10 Jun 2021 07:48:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3FF4F6892F;\n\tThu, 10 Jun 2021 09:48:17 +0200 (CEST)","from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net\n\t[217.70.183.200])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 942EA602C5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Jun 2021 09:48:15 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 6A4012000D;\n\tThu, 10 Jun 2021 07:48:14 +0000 (UTC)"],"Date":"Thu, 10 Jun 2021 09:49:04 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20210610074904.6zwzpg5dfwtlujza@uno.localdomain>","References":"<20210607181506.51711-1-nfraprado@collabora.com>\n\t<20210607181506.51711-3-nfraprado@collabora.com>\n\t<20210609163428.4jzxbqd2pq2ox6zi@uno.localdomain>\n\t<20210609195701.h42fmakx3jaozybf@notapiano>\n\t<YMFtwH2FtvZixM/D@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<YMFtwH2FtvZixM/D@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v6 2/5] lc-compliance: Make\n\tSimpleCapture::stop() idempotent","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, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]