[libcamera-devel] [PATCH v3 11/11] libcamera: camera: Lock the pipeline handler in acquire()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat May 11 15:37:37 CEST 2019


Hi Niklas,

Thank you for the patch.

On Sat, May 11, 2019 at 11:19:07AM +0200, Niklas Söderlund wrote:
> To allow more than one application using libcamera simultaneously there
> can be no overlap between which cameras are in use by which user. As a
> camera is part of a pipeline handler and there might be shared resources
> between all cameras exposed by that pipeline handler it's not enough to
> to only lock access to a single camera, all cameras from that pipeline
> need to be tied to the same process.
> 
> Allow for this by locking the whole pipeline when one of its cameras
> is acquired by the user. Other processes can still enumerate and list
> all cameras in the system but can't acquire a camera from a locked
> pipeline handler.
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  src/libcamera/camera.cpp | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index cb45bafe3fb1ff85..b7c9b80de409baf3 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -489,6 +489,11 @@ int Camera::acquire()

You should update the documentation of the acquire() and release()
methods.

>  	if (!stateIs(CameraAvailable))
>  		return -EBUSY;
>  
> +	if (!pipe_->lock()) {
> +		LOG(Camera, Info) << "Pipeline handler in use by other process";

s/other/another/

> +		return -EBUSY;
> +	}
> +
>  	state_ = CameraAcquired;
>  
>  	return 0;
> @@ -510,6 +515,8 @@ int Camera::release()
>  	if (!stateBetween(CameraAvailable, CameraConfigured))
>  		return -EBUSY;
>  
> +	pipe_->unlock();
> +
>  	state_ = CameraAvailable;
>  
>  	return 0;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list