[libcamera-devel,v2,2/4] libcamera: camera_manager: Use std::unique_ptr to store event dispatcher

Message ID 20190118232617.14631-3-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Object lifetime management
Related show

Commit Message

Laurent Pinchart Jan. 18, 2019, 11:26 p.m. UTC
The CameraManager takes ownership of the dispatcher passed to the
setEventDispatcher() function. Enforces this by using std::unique_ptr<>.

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

- Use make_unique<> in CameraManager::setEventDispatcher()
---
 include/libcamera/camera_manager.h |  4 ++--
 src/libcamera/camera_manager.cpp   | 12 +++++++-----
 2 files changed, 9 insertions(+), 7 deletions(-)

Patch

diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index 6cfcba3c3933..b82a8ce95b9f 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -29,7 +29,7 @@  public:
 
 	static CameraManager *instance();
 
-	void setEventDispatcher(EventDispatcher *dispatcher);
+	void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
 	EventDispatcher *eventDispatcher();
 
 private:
@@ -41,7 +41,7 @@  private:
 	std::unique_ptr<DeviceEnumerator> enumerator_;
 	std::vector<PipelineHandler *> pipes_;
 
-	EventDispatcher *dispatcher_;
+	std::unique_ptr<EventDispatcher> dispatcher_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 9f554be57e33..1430bb0d75a5 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -12,6 +12,7 @@ 
 #include "event_dispatcher_poll.h"
 #include "log.h"
 #include "pipeline_handler.h"
+#include "utils.h"
 
 /**
  * \file camera_manager.h
@@ -58,7 +59,6 @@  CameraManager::CameraManager()
 
 CameraManager::~CameraManager()
 {
-	delete dispatcher_;
 }
 
 /**
@@ -209,14 +209,14 @@  CameraManager *CameraManager::instance()
  * The CameraManager takes ownership of the event dispatcher and will delete it
  * when the application terminates.
  */
-void CameraManager::setEventDispatcher(EventDispatcher *dispatcher)
+void CameraManager::setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher)
 {
 	if (dispatcher_) {
 		LOG(Warning) << "Event dispatcher is already set";
 		return;
 	}
 
-	dispatcher_ = dispatcher;
+	dispatcher_ = std::move(dispatcher);
 }
 
 /**
@@ -226,14 +226,16 @@  void CameraManager::setEventDispatcher(EventDispatcher *dispatcher)
  * If no dispatcher has been set, a default poll-based implementation is created
  * and returned, and no custom event dispatcher may be installed anymore.
  *
+ * The returned event dispatcher is valid until the camera manager is destroyed.
+ *
  * \return Pointer to the event dispatcher
  */
 EventDispatcher *CameraManager::eventDispatcher()
 {
 	if (!dispatcher_)
-		dispatcher_ = new EventDispatcherPoll();
+		dispatcher_ = utils::make_unique<EventDispatcherPoll>();
 
-	return dispatcher_;
+	return dispatcher_.get();
 }
 
 } /* namespace libcamera */