summaryrefslogtreecommitdiff
path: root/src/libcamera/camera.cpp
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-04-14 02:59:58 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-05-17 20:38:34 +0200
commit9f7649a1f40e1f6625385e3c9f11745a24a4a253 (patch)
tree7eabb6d6077b89fb9abed8fb52142e27fcf52fc5 /src/libcamera/camera.cpp
parentd07975950caded00edd9ba240f5737f10ae828a7 (diff)
libcamera: camera: Lock the pipeline handler in acquire()
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> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/camera.cpp')
-rw-r--r--src/libcamera/camera.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index cb45bafe..fbc66ded 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 handler to the same instance of libcamera. The limit is in
+ * effect until all cameras from the pipeline handler are released. Other
+ * 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;