[libcamera-devel] [PATCH v3 06/11] libcamera: camera: Validate requests are completed in Running state

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Mar 25 14:42:26 CET 2021


All requests must have completed before the Camera has fully stopped.

Requests completing when the camera is not running represent an internal
pipeline handler bug.

Trap this event with a fatal error.

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 src/libcamera/camera.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 84edbb8f494d..b86bff4745b2 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -1062,11 +1062,11 @@ int Camera::stop()
 
 	LOG(Camera, Debug) << "Stopping capture";
 
-	d->setState(Private::CameraConfigured);
-
 	d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,
 			       this);
 
+	d->setState(Private::CameraConfigured);
+
 	return 0;
 }
 
@@ -1079,6 +1079,13 @@ int Camera::stop()
  */
 void Camera::requestComplete(Request *request)
 {
+	Private *const d = LIBCAMERA_D_PTR();
+
+	/* Disconnected cameras are still able to complete requests. */
+	int ret = d->isAccessAllowed(Private::CameraRunning);
+	if (ret < 0 && ret != -ENODEV)
+		LOG(Camera, Fatal) << "Trying to complete a request when stopped";
+
 	requestCompleted.emit(request);
 }
 
-- 
2.25.1



More information about the libcamera-devel mailing list