[{"id":31095,"web_url":"https://patchwork.libcamera.org/comment/31095/","msgid":"<bc724c46-836d-4c88-b630-53b794ce8df2@ideasonboard.com>","date":"2024-09-05T11:01:44","subject":"Re: [PATCH v3 2/2] pipeline: rkisp1: Use ScopeExitActions to\n\tsimplify error handling in start","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent\n\nThank you for the patch.\n\nOn 04/08/24 9:01 pm, Laurent Pinchart wrote:\n> Error handling in the PipelineHandlerRkISP1::start() function is\n> cumbersome. Simplify it using the utils::ScopeExitActions class.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com>\n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n> ---\n>   src/libcamera/pipeline/rkisp1/rkisp1.cpp | 31 +++++++++---------------\n>   1 file changed, 11 insertions(+), 20 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index eec5bf949bed..f7ca7025f95b 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -915,71 +915,62 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n>   int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n>   {\n>   \tRkISP1CameraData *data = cameraData(camera);\n> +\tutils::ScopeExitActions actions;\n>   \tint ret;\n>   \n>   \t/* Allocate buffers for internal pipeline usage. */\n>   \tret = allocateBuffers(camera);\n>   \tif (ret)\n>   \t\treturn ret;\n> +\tactions += [&]() { freeBuffers(camera); };\n>   \n>   \tret = data->ipa_->start();\n>   \tif (ret) {\n> -\t\tfreeBuffers(camera);\n>   \t\tLOG(RkISP1, Error)\n>   \t\t\t<< \"Failed to start IPA \" << camera->id();\n>   \t\treturn ret;\n>   \t}\n> +\tactions += [&]() { data->ipa_->stop(); };\n>   \n>   \tdata->frame_ = 0;\n>   \n>   \tif (!isRaw_) {\n>   \t\tret = param_->streamOn();\n>   \t\tif (ret) {\n> -\t\t\tdata->ipa_->stop();\n> -\t\t\tfreeBuffers(camera);\n>   \t\t\tLOG(RkISP1, Error)\n>   \t\t\t\t<< \"Failed to start parameters \" << camera->id();\n>   \t\t\treturn ret;\n>   \t\t}\n> +\t\tactions += [&]() { param_->streamOff(); };\n>   \n>   \t\tret = stat_->streamOn();\n>   \t\tif (ret) {\n> -\t\t\tparam_->streamOff();\n> -\t\t\tdata->ipa_->stop();\n> -\t\t\tfreeBuffers(camera);\n>   \t\t\tLOG(RkISP1, Error)\n>   \t\t\t\t<< \"Failed to start statistics \" << camera->id();\n>   \t\t\treturn ret;\n>   \t\t}\n> +\t\tactions += [&]() { stat_->streamOff(); };\n>   \t}\n>   \n>   \tif (data->mainPath_->isEnabled()) {\n>   \t\tret = mainPath_.start();\n> -\t\tif (ret) {\n> -\t\t\tparam_->streamOff();\n> -\t\t\tstat_->streamOff();\n> -\t\t\tdata->ipa_->stop();\n> -\t\t\tfreeBuffers(camera);\n> +\t\tif (ret)\n>   \t\t\treturn ret;\n> -\t\t}\n> +\t\tactions += [&]() { mainPath_.stop(); };\n>   \t}\n>   \n>   \tif (hasSelfPath_ && data->selfPath_->isEnabled()) {\n>   \t\tret = selfPath_.start();\n> -\t\tif (ret) {\n> -\t\t\tmainPath_.stop();\n> -\t\t\tparam_->streamOff();\n> -\t\t\tstat_->streamOff();\n> -\t\t\tdata->ipa_->stop();\n> -\t\t\tfreeBuffers(camera);\n> +\t\tif (ret)\n>   \t\t\treturn ret;\n> -\t\t}\n>   \t}\n>   \n>   \tisp_->setFrameStartEnabled(true);\n>   \n>   \tactiveCamera_ = camera;\n> -\treturn ret;\n> +\n> +\tactions.release();\n> +\treturn 0;\n>   }\n>   \n>   void PipelineHandlerRkISP1::stopDevice(Camera *camera)","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 56C4BC324C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  5 Sep 2024 11:01:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 11A37634E3;\n\tThu,  5 Sep 2024 13:01:51 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 422226345D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Sep 2024 13:01:49 +0200 (CEST)","from [IPV6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f] (unknown\n\t[IPv6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8037AD0;\n\tThu,  5 Sep 2024 13:00:35 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"uQ3nNXZC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1725534036;\n\tbh=8peBYcvnXO/qbyabvhTwCw54b9eesS9lHTQrCA+STKc=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=uQ3nNXZCJaNjkyYfGoK7Fv1Jif0p4HC0X6U5fw/GD7SUWGq4HGQ6CkIKL+WyleJWz\n\tgVgsk/3Jv0Yiaj07a5+0Lxg/cS6zll7nTJNTrxKbLgNAJT/Xkuksww1W3mM1cFq0t3\n\t1tnDhWvxCT+QXs+uO4ysZr4a06qj37khzF89LTXQ=","Message-ID":"<bc724c46-836d-4c88-b630-53b794ce8df2@ideasonboard.com>","Date":"Thu, 5 Sep 2024 16:31:44 +0530","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v3 2/2] pipeline: rkisp1: Use ScopeExitActions to\n\tsimplify error handling in start","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20240804153106.22167-1-laurent.pinchart@ideasonboard.com>\n\t<20240804153106.22167-3-laurent.pinchart@ideasonboard.com>","Content-Language":"en-US","From":"Umang Jain <umang.jain@ideasonboard.com>","In-Reply-To":"<20240804153106.22167-3-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]