[libcamera-devel] [PATCH v4 11/11] libcamera: camera: Lock the pipeline handler in acquire()
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri May 17 11:31:01 CEST 2019
Hi Niklas,
Thank you for the patch.
On Fri, May 17, 2019 at 02:54:47AM +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 | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index cb45bafe3fb1ff85..a83768fcde126c32 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -470,13 +470,17 @@ void Camera::disconnect()
> * not blocking, if the device has already been acquired (by the same or another
> * process) the -EBUSY error code is returned.
> *
> + * Acquiring a camera will limit usage of any other camera(s) provided by the
> + * same pipeline hander to the same instance of libcamera. The limit is in
s/hander/handler/
> + * effect until all cameras from the pipeline handler are released(). Other
"released" isn't a function, you should write "released" or "released
with release()". As the release() function is mentioned elsewhere in
this documentation block, I would leave it out here.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + * instances of libcamera can still list and examine the cameras but will fail
> + * if they attempt to acquire() any of them.
> + *
> * Once exclusive access isn't needed anymore, the device should be released
> * with a call to the release() function.
> *
> * This function affects the state of the camera, see \ref camera_operation.
> *
> - * \todo Implement exclusive access across processes.
> - *
> * \return 0 on success or a negative error code otherwise
> * \retval -ENODEV The camera has been disconnected from the system
> * \retval -EBUSY The camera is not free and can't be acquired by the caller
> @@ -489,6 +493,12 @@ int Camera::acquire()
> if (!stateIs(CameraAvailable))
> return -EBUSY;
>
> + if (!pipe_->lock()) {
> + LOG(Camera, Info)
> + << "Pipeline handler in use by another process";
> + return -EBUSY;
> + }
> +
> state_ = CameraAcquired;
>
> return 0;
> @@ -510,6 +520,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