[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