summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-08-11 19:34:44 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-08-16 23:57:27 +0300
commite77c8951e9ff91bf2bacf81791a882ccb3cee30b (patch)
treeac66ba86468ae1aa5ad619c5fb276687aee65677
parent5420e359f2416f6d290eea626dddb3a881dd900c (diff)
libcamera: base: extensible: Pass private pointer as unique_ptr<>
The Extensible constructor takes a pointer to a Private instance, whose lifetime it then manages. Make this explicit in the API by passing the pointer as a std::unique_ptr<Private>. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--include/libcamera/base/class.h2
-rw-r--r--src/android/camera_buffer.h2
-rw-r--r--src/android/camera_hal_config.cpp2
-rw-r--r--src/libcamera/base/class.cpp11
-rw-r--r--src/libcamera/camera.cpp2
-rw-r--r--src/libcamera/camera_manager.cpp2
-rw-r--r--src/libcamera/framebuffer.cpp3
7 files changed, 16 insertions, 8 deletions
diff --git a/include/libcamera/base/class.h b/include/libcamera/base/class.h
index a5946836..9a82d614 100644
--- a/include/libcamera/base/class.h
+++ b/include/libcamera/base/class.h
@@ -87,7 +87,7 @@ public:
Extensible *const o_;
};
- Extensible(Private *d);
+ Extensible(std::unique_ptr<Private> d);
protected:
template<typename T>
diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
index 21373fa2..c4e3a9e7 100644
--- a/src/android/camera_buffer.h
+++ b/src/android/camera_buffer.h
@@ -32,7 +32,7 @@ public:
#define PUBLIC_CAMERA_BUFFER_IMPLEMENTATION \
CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) \
- : Extensible(new Private(this, camera3Buffer, flags)) \
+ : Extensible(std::make_unique<Private>(this, camera3Buffer, flags)) \
{ \
} \
CameraBuffer::~CameraBuffer() \
diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp
index 14549083..aa90dac7 100644
--- a/src/android/camera_hal_config.cpp
+++ b/src/android/camera_hal_config.cpp
@@ -341,7 +341,7 @@ int CameraHalConfig::Private::parseConfigFile(FILE *fh,
}
CameraHalConfig::CameraHalConfig()
- : Extensible(new Private()), exists_(false), valid_(false)
+ : Extensible(std::make_unique<Private>()), exists_(false), valid_(false)
{
parseConfigurationFile();
}
diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp
index d24043c2..9c2d9f21 100644
--- a/src/libcamera/base/class.cpp
+++ b/src/libcamera/base/class.cpp
@@ -147,9 +147,12 @@ namespace libcamera {
/**
* \brief Construct an instance of an Extensible class
* \param[in] d Pointer to the private data instance
+ *
+ * The private data lifetime is managed by the Extensible class, which destroys
+ * it when the Extensible instance is destroyed.
*/
-Extensible::Extensible(Extensible::Private *d)
- : d_(d)
+Extensible::Extensible(std::unique_ptr<Extensible::Private> d)
+ : d_(std::move(d))
{
*const_cast<Extensible **>(&d_->o_) = this;
}
@@ -163,6 +166,10 @@ Extensible::Extensible(Extensible::Private *d)
* overriden _d() functions that return the correct pointer type to the
* corresponding derived Private class.
*
+ * The lifetime of the private data is tied to the Extensible class. The caller
+ * shall not retain any reference to the returned pointer for longer than it
+ * holds a reference to the Extensible instance.
+ *
* \return A pointer to the private data instance
*/
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 6281e920..8e99e2a9 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -596,7 +596,7 @@ const std::string &Camera::id() const
Camera::Camera(PipelineHandler *pipe, const std::string &id,
const std::set<Stream *> &streams)
- : Extensible(new Private(pipe, id, streams))
+ : Extensible(std::make_unique<Private>(pipe, id, streams))
{
}
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 893aa606..fe80a46f 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -258,7 +258,7 @@ void CameraManager::Private::removeCamera(Camera *camera)
CameraManager *CameraManager::self_ = nullptr;
CameraManager::CameraManager()
- : Extensible(new CameraManager::Private())
+ : Extensible(std::make_unique<CameraManager::Private>())
{
if (self_)
LOG(Camera, Fatal)
diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
index 42c73134..b401c50e 100644
--- a/src/libcamera/framebuffer.cpp
+++ b/src/libcamera/framebuffer.cpp
@@ -181,7 +181,8 @@ FrameBuffer::Private::Private()
* \param[in] cookie Cookie
*/
FrameBuffer::FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie)
- : Extensible(new Private()), planes_(planes), cookie_(cookie)
+ : Extensible(std::make_unique<Private>()), planes_(planes),
+ cookie_(cookie)
{
}