From patchwork Wed Aug 11 23:26:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13309 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id F0259BD87D for ; Wed, 11 Aug 2021 23:26:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id BCFBE68864; Thu, 12 Aug 2021 01:26:35 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="N4wFZPAW"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 31BCF687F0 for ; Thu, 12 Aug 2021 01:26:33 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C76A4268 for ; Thu, 12 Aug 2021 01:26:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628724393; bh=H2u5dhstkCecZM9hLjgVY+1bubA1b/nvotS1plmbePs=; h=From:To:Subject:Date:In-Reply-To:References:From; b=N4wFZPAWivV3CGVhGcE2oVgODg7pFmqMcHtyqcB47tY4vHf2+A45Iz/ufiHrw22ec sH5Erv8gz8MZFZ7dKY4Tw7SVmXraWiX5yGCj69uBe3tOr/HYPiOHZNSk5+R68Q62vS 3HjyaIWRradmzFDvYluVNe9CqfM68EzS3lsLIYA4= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 12 Aug 2021 02:26:12 +0300 Message-Id: <20210811232625.17280-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210811232625.17280-1-laurent.pinchart@ideasonboard.com> References: <20210811232625.17280-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 01/14] libcamera: base: extensible: Pass private pointer as unique_ptr<> X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- include/libcamera/base/class.h | 2 +- src/android/camera_buffer.h | 2 +- src/android/camera_hal_config.cpp | 2 +- src/libcamera/base/class.cpp | 11 +++++++++-- src/libcamera/camera.cpp | 2 +- src/libcamera/camera_manager.cpp | 2 +- src/libcamera/framebuffer.cpp | 3 ++- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/libcamera/base/class.h b/include/libcamera/base/class.h index a5946836d2b9..9a82d61472c1 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 d); protected: template diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h index 21373fa25bf8..c4e3a9e7b912 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(this, camera3Buffer, flags)) \ { \ } \ CameraBuffer::~CameraBuffer() \ diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp index 14549083a97a..aa90dac78075 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()), exists_(false), valid_(false) { parseConfigurationFile(); } diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp index d24043c20e55..9c2d9f218bd4 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 d) + : d_(std::move(d)) { *const_cast(&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 6281e92057e4..8e99e2a96eaf 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 &streams) - : Extensible(new Private(pipe, id, streams)) + : Extensible(std::make_unique(pipe, id, streams)) { } diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 893aa6067171..fe80a46f5d20 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()) { if (self_) LOG(Camera, Fatal) diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp index 42c73134152b..b401c50efd53 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 &planes, unsigned int cookie) - : Extensible(new Private()), planes_(planes), cookie_(cookie) + : Extensible(std::make_unique()), planes_(planes), + cookie_(cookie) { }