summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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;