[libcamera-devel] [PATCH 5/5] libcamera: pipeline: Refuse to substitute camera data

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Jan 25 18:13:15 CET 2019


Hi Jacopo,

Thank you for the patch.

On Fri, Jan 25, 2019 at 06:04:00PM +0100, Jacopo Mondi wrote:
> Once a pipeline-specific data has been associated with a camera, refuse
> to update it in order to avoid invalidating the previously set
> reference, which might still be owned by the caller.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/include/pipeline_handler.h |  2 +-
>  src/libcamera/pipeline_handler.cpp       | 23 ++++++++++++++---------
>  2 files changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
> index ca77a40..01a0f0b 100644
> --- a/src/libcamera/include/pipeline_handler.h
> +++ b/src/libcamera/include/pipeline_handler.h
> @@ -47,7 +47,7 @@ protected:
>  	void hotplugMediaDevice(MediaDevice *media);
>  
>  	CameraData *cameraData(const Camera *camera);
> -	void setCameraData(const Camera *camera, std::unique_ptr<CameraData> data);
> +	int setCameraData(const Camera *camera, std::unique_ptr<CameraData> data);
>  
>  private:
>  	virtual void disconnect();
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index dc55f8f..7e927a7 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -212,21 +212,26 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)
>   * information with \a camera. Ownership of \a data is transferred to
>   * the PipelineHandler.
>   *
> - * If pipeline-specific data has already been associated with the camera by a
> - * previous call to this method, is it replaced by \a data and the previous data
> - * are deleted, rendering all references to them invalid.
> + * Once pipeline-specific data has already been associated with the camera
> + * by a previous call to this method it cannot be changed later on.

Maybe "Pipeline-specific data can only be set once. Any attempt to call
this method after the first one with the same camera will return an
error and won't affect the pipeline-specific data." ? Up to you.

>   *
>   * The data can be retrieved by pipeline handlers using the cameraData() method.
> + *
> + * \return 0 on success, or a negative error code if camera specific data have
> + * already been set
>   */
> -void PipelineHandler::setCameraData(const Camera *camera,
> -				    std::unique_ptr<CameraData> data)
> +int PipelineHandler::setCameraData(const Camera *camera,
> +				   std::unique_ptr<CameraData> data)
>  {
> -	if (cameraData_.count(camera))
> -		LOG(Pipeline, Debug)
> -			<< "Replacing data associated with "
> -			<< camera->name();
> +	if (cameraData_.find(camera) != cameraData_.end()) {
> +		LOG(Pipeline, Error)
> +			<< "Replacing data associated with a camera is forbidden ";

s/ ";/";/

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +		return -EINVAL;
> +	}
>  
>  	cameraData_[camera] = std::move(data);
> +
> +	return 0;
>  }
>  
>  /**

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list