[libcamera-devel] [PATCH v3 22/22] libcamera: pipeline: rkisp1: Use cleanup error paths for start()
Niklas Söderlund
niklas.soderlund at ragnatech.se
Fri Sep 25 18:57:31 CEST 2020
Hi Jacopo,
On 2020-09-25 17:36:00 +0200, Jacopo Mondi wrote:
> Hi Niklas,
>
> On Fri, Sep 25, 2020 at 03:42:07AM +0200, Niklas Söderlund wrote:
> > Use a lambda function to make the error paths a bit cleaner in start(),
> > no functional change.
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> > src/libcamera/pipeline/rkisp1/rkisp1.cpp | 98 ++++++++++++------------
> > 1 file changed, 51 insertions(+), 47 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index c6c2e3aa3dc6d0dc..34196af3057b14bb 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -827,58 +827,62 @@ int PipelineHandlerRkISP1::start(Camera *camera)
> > RkISP1CameraData *data = cameraData(camera);
> > int ret;
> >
> > - /* Allocate buffers for internal pipeline usage. */
> > - ret = allocateBuffers(camera);
> > - if (ret)
> > - return ret;
> > -
> > - ret = data->ipa_->start();
> > - if (ret) {
> > - freeBuffers(camera);
> > - LOG(RkISP1, Error)
> > - << "Failed to start IPA " << camera->id();
> > - return ret;
> > - }
> > -
> > - data->frame_ = 0;
> > -
> > - ret = param_->streamOn();
> > - if (ret) {
> > - data->ipa_->stop();
> > - freeBuffers(camera);
> > - LOG(RkISP1, Error)
> > - << "Failed to start parameters " << camera->id();
> > - return ret;
> > - }
> > -
> > - ret = stat_->streamOn();
> > - if (ret) {
> > - param_->streamOff();
> > - data->ipa_->stop();
> > - freeBuffers(camera);
> > - LOG(RkISP1, Error)
> > - << "Failed to start statistics " << camera->id();
> > - return ret;
> > - }
> > -
> > - ret = mainPath_.start();
> > - if (ret) {
> > - param_->streamOff();
> > - stat_->streamOff();
> > - data->ipa_->stop();
> > - freeBuffers(camera);
> > - return ret;
> > - }
> > -
> > - ret = selfPath_.start();
> > - if (ret) {
> > + auto startDevices = [this](Camera *camera, RkISP1CameraData *data) {
>
> Why a lamda function for a function that is only called for a single place as a
> regulr function ?
It was suggested in review of an earlier version to make the code more
readable. But as the cover letter suggests this 22/22 should be thought
of as a RFC. I found it rather neat to make the code more readable.
>
> Also, shouldn't re-working the existing code to use labels be better ?
Maybe, it's such a larger function so I thought it neater to crate a
separate "block" for the code needing error handling. If this was C I
would have created a helper function just to get it out but creating a
helper class function for this seems a bit much so a lambda was
somewhere in the middle.
Maybe I will break this out of this series so people don't spend all
review energy bikeshedding over this one ;-P
>
> > + int ret;
> > +
> > + /* Allocate buffers for internal pipeline usage. */
> > + ret = allocateBuffers(camera);
> > + if (ret)
> > + return ret;
> > +
> > + ret = data->ipa_->start();
> > + if (ret) {
> > + LOG(RkISP1, Error)
> > + << "Failed to start IPA " << camera->id();
> > + goto err_allocate;
> > + }
> > +
> > + data->frame_ = 0;
> > +
> > + ret = param_->streamOn();
> > + if (ret) {
> > + LOG(RkISP1, Error)
> > + << "Failed to start parameters " << camera->id();
> > + goto err_ipa;
> > + }
> > +
> > + ret = stat_->streamOn();
> > + if (ret) {
> > + LOG(RkISP1, Error)
> > + << "Failed to start statistics " << camera->id();
> > + goto err_param;
> > + }
> > +
> > + ret = mainPath_.start();
> > + if (ret)
> > + goto err_stat;
> > +
> > + ret = selfPath_.start();
> > + if (ret)
> > + goto err_main;
> > +
> > + return 0;
> > + err_main:
> > mainPath_.stop();
> > - param_->streamOff();
> > + err_stat:
> > stat_->streamOff();
> > + err_param:
> > + param_->streamOff();
> > + err_ipa:
> > data->ipa_->stop();
> > + err_allocate:
> > freeBuffers(camera);
> > return ret;
> > - }
> > + };
> > +
> > + ret = startDevices(camera, data);
> > + if (ret)
> > + return ret;
> >
> > activeCamera_ = camera;
> >
> > --
> > 2.28.0
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list