[libcamera-devel] [PATCH v3 22/22] libcamera: pipeline: rkisp1: Use cleanup error paths for start()

Jacopo Mondi jacopo at jmondi.org
Fri Sep 25 17:36:00 CEST 2020


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 ?

Also, shouldn't re-working the existing code to use labels be better ?

> +		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


More information about the libcamera-devel mailing list