diff options
-rw-r--r-- | src/libcamera/camera.cpp | 16 |
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; |