[libcamera-devel] [PATCH v2 04/11] libcamera: camera_manager: Make the class a singleton

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Jan 8 00:11:44 CET 2019


There can only be a single camera manager instance in the application.
Creating it as a singleton helps avoiding mistakes. It also allows the
camera manager to be used as a storage of global data, such as the
future event dispatcher.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
---
Changes since v1:

- Delete copy constructor and assignment operator
- Fix documentation style issue
---
 include/libcamera/camera_manager.h |  8 ++++++--
 src/libcamera/camera_manager.cpp   | 15 +++++++++++++++
 test/list.cpp                      |  7 +------
 3 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index 2768a5bd2384..e14da0f893b3 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -19,15 +19,19 @@ class PipelineHandler;
 class CameraManager
 {
 public:
-	CameraManager();
-
 	int start();
 	void stop();
 
 	std::vector<std::string> list() const;
 	Camera *get(const std::string &name);
 
+	static CameraManager *instance();
+
 private:
+	CameraManager();
+	CameraManager(const CameraManager &) = delete;
+	void operator=(const CameraManager &) = delete;
+
 	DeviceEnumerator *enumerator_;
 	std::vector<PipelineHandler *> pipes_;
 };
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 50a805fc665c..1a9d2f38e3b9 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -161,4 +161,19 @@ Camera *CameraManager::get(const std::string &name)
 	return nullptr;
 }
 
+/**
+ * \brief Retrieve the camera manager instance
+ *
+ * The CameraManager is a singleton and can't be constructed manually. This
+ * function shall instead be used to retrieve the single global instance of the
+ * manager.
+ *
+ * \return The camera manager instance
+ */
+CameraManager *CameraManager::instance()
+{
+	static CameraManager manager;
+	return &manager;
+}
+
 } /* namespace libcamera */
diff --git a/test/list.cpp b/test/list.cpp
index 39b8a41d1fef..e2026c99c5b8 100644
--- a/test/list.cpp
+++ b/test/list.cpp
@@ -19,10 +19,7 @@ class ListTest : public Test
 protected:
 	int init()
 	{
-		cm = new CameraManager();
-		if (!cm)
-			return -ENOMEM;
-
+		cm = CameraManager::instance();
 		cm->start();
 
 		return 0;
@@ -43,8 +40,6 @@ protected:
 	void cleanup()
 	{
 		cm->stop();
-
-		delete cm;
 	}
 
 private:
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list