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

Message ID 20190414013506.10515-12-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • libcamerea: Add support for exclusive access to cameras between processes
Related show

Commit Message

Niklas Söderlund April 14, 2019, 1:35 a.m. UTC
To allow more then 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
needs to be tied to the same process.

Allow for this by locking the whole pipeline when one of it's cameras
are acquired by the user. Other processes can still enumerate and list
all cameras in the system but cant progress a camera in a locked
pipeline handler to the Acquired state.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/libcamera/camera.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Laurent Pinchart April 18, 2019, 10:20 a.m. UTC | #1
Hi Niklas,

Thank you for the patch.

On Sun, Apr 14, 2019 at 03:35:06AM +0200, Niklas Söderlund wrote:
> To allow more then one application using libcamera simultaneously there

s/then/than/

> 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
> needs to be tied to the same process.

s/needs/need/

Uitimately that should be a pipeline handler's decision, as there may
not be shared resources. We don't have to implement this today, but we
should start thinking about it. For instance, should we pass the camera
pointer to the pipeline handler's lock() function ?

> Allow for this by locking the whole pipeline when one of it's cameras

s/it's/its/

> are acquired by the user. Other processes can still enumerate and list

s/are/is/

> all cameras in the system but cant progress a camera in a locked

s/cant/can't/

> pipeline handler to the Acquired state.

"can't acquire a camera from a locked pipeline handler" ?

> Signed-off-by: Niklas Söderlund <niklas.soderlund@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 bdf14b31d8eeba9c..b3860952efa6446f 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -495,6 +495,11 @@ int Camera::acquire()
>  	if (!stateIs(CameraAvailable))
>  		return -EBUSY;
>  
> +	if (!pipe_->lock()) {
> +		LOG(Camera, Info) << "Camera in use by other process";

s/Camera/Pipeline handler/ ?

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

Patch

diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index bdf14b31d8eeba9c..b3860952efa6446f 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -495,6 +495,11 @@  int Camera::acquire()
 	if (!stateIs(CameraAvailable))
 		return -EBUSY;
 
+	if (!pipe_->lock()) {
+		LOG(Camera, Info) << "Camera in use by other process";
+		return -EBUSY;
+	}
+
 	state_ = CameraAcquired;
 
 	return 0;
@@ -516,6 +521,8 @@  int Camera::release()
 	if (!stateBetween(CameraAvailable, CameraConfigured))
 		return -EBUSY;
 
+	pipe_->unlock();
+
 	state_ = CameraAvailable;
 
 	return 0;