[v1] treewide: Query list of cameras just once
diff mbox series

Message ID 20240425152010.313205-1-pobrn@protonmail.com
State Superseded
Headers show
Series
  • [v1] treewide: Query list of cameras just once
Related show

Commit Message

Barnabás Pőcze April 25, 2024, 3:20 p.m. UTC
This is more efficient since only a single vector will be constructed,
and furthermore, it prevents the TOCTOU issue that might arise when
the list of cameras changes between the two queries.
---
 Documentation/guides/application-developer.rst | 8 ++++----
 src/apps/cam/camera_session.cpp                | 6 ++++--
 src/gstreamer/gstlibcamerasrc.cpp              | 5 +++--
 3 files changed, 11 insertions(+), 8 deletions(-)


base-commit: fb74bb7df66b96dbe28702155cddfc96a1b30f78

Patch
diff mbox series

diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst
index 9a9905b1..dfbc268d 100644
--- a/Documentation/guides/application-developer.rst
+++ b/Documentation/guides/application-developer.rst
@@ -115,20 +115,20 @@  by name from the Camera Manager, after making sure that at least one camera is
 available.
 
 .. code:: cpp
-
-   if (cm->cameras().empty()) {
+   auto cameras = cm->cameras();
+   if (cameras.empty()) {
        std::cout << "No cameras were identified on the system."
                  << std::endl;
        cm->stop();
        return EXIT_FAILURE;
    }
 
-   std::string cameraId = cm->cameras()[0]->id();
+   std::string cameraId = cameras[0]->id();
    camera = cm->get(cameraId);
 
    /*
     * Note that is equivalent to:
-    * camera = cm->cameras()[0];
+    * camera = cameras[0];
     */
 
 Once a camera has been selected an application needs to acquire an exclusive
diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp
index 8447f932..5afd087f 100644
--- a/src/apps/cam/camera_session.cpp
+++ b/src/apps/cam/camera_session.cpp
@@ -39,8 +39,10 @@  CameraSession::CameraSession(CameraManager *cm,
 {
 	char *endptr;
 	unsigned long index = strtoul(cameraId.c_str(), &endptr, 10);
-	if (*endptr == '\0' && index > 0 && index <= cm->cameras().size())
-		camera_ = cm->cameras()[index - 1];
+	auto cameras = cm->cameras();
+
+	if (*endptr == '\0' && index > 0 && index <= cameras.size())
+		camera_ = std::move(cameras[index - 1]);
 	else
 		camera_ = cm->get(cameraId);
 
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index f015c6d2..8613d66d 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -385,13 +385,14 @@  gst_libcamera_src_open(GstLibcameraSrc *self)
 			return false;
 		}
 	} else {
-		if (cm->cameras().empty()) {
+		auto cameras = cm->cameras();
+		if (cameras.empty()) {
 			GST_ELEMENT_ERROR(self, RESOURCE, NOT_FOUND,
 					  ("Could not find any supported camera on this system."),
 					  ("libcamera::CameraMananger::cameras() is empty"));
 			return false;
 		}
-		cam = cm->cameras()[0];
+		cam = std::move(cameras[0]);
 	}
 
 	GST_INFO_OBJECT(self, "Using camera '%s'", cam->id().c_str());