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

Message ID 20190508151831.12274-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 May 8, 2019, 3:18 p.m. UTC
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@ragnatech.se>
---
 src/libcamera/camera.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

Patch

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