[libcamera-devel] [PATCH v2 4/5] libcamera: camera_manager: Inherit from Extensible

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Oct 20 03:40:04 CEST 2020


Use the d-pointer infrastructure offered by the Extensible class to
replace the custom implementation.

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

- Declare variables explicitly
---
 include/libcamera/camera_manager.h |  7 ++--
 src/libcamera/camera_manager.cpp   | 55 +++++++++++++++++++-----------
 2 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index 9eb2b6f5a5f5..6d5341c76412 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -12,6 +12,7 @@
 #include <sys/types.h>
 #include <vector>
 
+#include <libcamera/extensible.h>
 #include <libcamera/object.h>
 #include <libcamera/signal.h>
 
@@ -20,8 +21,9 @@ namespace libcamera {
 class Camera;
 class EventDispatcher;
 
-class CameraManager : public Object
+class CameraManager : public Object, public Extensible
 {
+	LIBCAMERA_DECLARE_PRIVATE(CameraManager)
 public:
 	CameraManager();
 	CameraManager(const CameraManager &) = delete;
@@ -50,9 +52,6 @@ public:
 private:
 	static const std::string version_;
 	static CameraManager *self_;
-
-	class Private;
-	std::unique_ptr<Private> p_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 3fef69633028..bcd6eac2d798 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -34,8 +34,10 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(Camera)
 
-class CameraManager::Private : public Thread
+class CameraManager::Private : public Extensible::Private, public Thread
 {
+	LIBCAMERA_DECLARE_PUBLIC(CameraManager)
+
 public:
 	Private(CameraManager *cm);
 
@@ -62,8 +64,6 @@ private:
 	void createPipelineHandlers();
 	void cleanup();
 
-	CameraManager *cm_;
-
 	std::condition_variable cv_;
 	bool initialized_;
 	int status_;
@@ -75,7 +75,7 @@ private:
 };
 
 CameraManager::Private::Private(CameraManager *cm)
-	: cm_(cm), initialized_(false)
+	: Extensible::Private(cm), initialized_(false)
 {
 }
 
@@ -136,6 +136,8 @@ int CameraManager::Private::init()
 
 void CameraManager::Private::createPipelineHandlers()
 {
+	CameraManager *const o = LIBCAMERA_O_PTR(CameraManager);
+
 	/*
 	 * \todo Try to read handlers and order from configuration
 	 * file and only fallback on all handlers if there is no
@@ -153,7 +155,7 @@ void CameraManager::Private::createPipelineHandlers()
 		 * all pipelines it can provide.
 		 */
 		while (1) {
-			std::shared_ptr<PipelineHandler> pipe = factory->create(cm_);
+			std::shared_ptr<PipelineHandler> pipe = factory->create(o);
 			if (!pipe->match(enumerator_.get()))
 				break;
 
@@ -264,7 +266,7 @@ void CameraManager::Private::removeCamera(Camera *camera)
 CameraManager *CameraManager::self_ = nullptr;
 
 CameraManager::CameraManager()
-	: p_(new CameraManager::Private(this))
+	: Extensible(new CameraManager::Private(this))
 {
 	if (self_)
 		LOG(Camera, Fatal)
@@ -292,9 +294,11 @@ CameraManager::~CameraManager()
  */
 int CameraManager::start()
 {
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
+
 	LOG(Camera, Info) << "libcamera " << version_;
 
-	int ret = p_->start();
+	int ret = d->start();
 	if (ret)
 		LOG(Camera, Error) << "Failed to start camera manager: "
 				   << strerror(-ret);
@@ -314,8 +318,9 @@ int CameraManager::start()
  */
 void CameraManager::stop()
 {
-	p_->exit();
-	p_->wait();
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
+	d->exit();
+	d->wait();
 }
 
 /**
@@ -331,9 +336,11 @@ void CameraManager::stop()
  */
 std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
 {
-	MutexLocker locker(p_->mutex_);
+	const Private *const d = LIBCAMERA_D_PTR(CameraManager);
 
-	return p_->cameras_;
+	MutexLocker locker(d->mutex_);
+
+	return d->cameras_;
 }
 
 /**
@@ -349,9 +356,11 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
  */
 std::shared_ptr<Camera> CameraManager::get(const std::string &id)
 {
-	MutexLocker locker(p_->mutex_);
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
 
-	for (std::shared_ptr<Camera> camera : p_->cameras_) {
+	MutexLocker locker(d->mutex_);
+
+	for (std::shared_ptr<Camera> camera : d->cameras_) {
 		if (camera->id() == id)
 			return camera;
 	}
@@ -377,10 +386,12 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &id)
  */
 std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
 {
-	MutexLocker locker(p_->mutex_);
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
 
-	auto iter = p_->camerasByDevnum_.find(devnum);
-	if (iter == p_->camerasByDevnum_.end())
+	MutexLocker locker(d->mutex_);
+
+	auto iter = d->camerasByDevnum_.find(devnum);
+	if (iter == d->camerasByDevnum_.end())
 		return nullptr;
 
 	return iter->second.lock();
@@ -431,9 +442,11 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
 void CameraManager::addCamera(std::shared_ptr<Camera> camera,
 			      const std::vector<dev_t> &devnums)
 {
-	ASSERT(Thread::current() == p_.get());
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
 
-	p_->addCamera(camera, devnums);
+	ASSERT(Thread::current() == d);
+
+	d->addCamera(camera, devnums);
 	cameraAdded.emit(camera);
 }
 
@@ -449,9 +462,11 @@ void CameraManager::addCamera(std::shared_ptr<Camera> camera,
  */
 void CameraManager::removeCamera(std::shared_ptr<Camera> camera)
 {
-	ASSERT(Thread::current() == p_.get());
+	Private *const d = LIBCAMERA_D_PTR(CameraManager);
 
-	p_->removeCamera(camera.get());
+	ASSERT(Thread::current() == d);
+
+	d->removeCamera(camera.get());
 	cameraRemoved.emit(camera);
 }
 
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list