From patchwork Fri Jan 25 17:04:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 392 Return-Path: Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 631E160C82 for ; Fri, 25 Jan 2019 18:04:13 +0100 (CET) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 00A1B200004; Fri, 25 Jan 2019 17:04:12 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Fri, 25 Jan 2019 18:04:00 +0100 Message-Id: <20190125170400.24821-6-jacopo@jmondi.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190125170400.24821-1-jacopo@jmondi.org> References: <20190125170400.24821-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 5/5] libcamera: pipeline: Refuse to substitute camera data X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Jan 2019 17:04:14 -0000 Once a pipeline-specific data has been associated with a camera, refuse to update it in order to avoid invalidating the previously set reference, which might still be owned by the caller. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/libcamera/include/pipeline_handler.h | 2 +- src/libcamera/pipeline_handler.cpp | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index ca77a40..01a0f0b 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -47,7 +47,7 @@ protected: void hotplugMediaDevice(MediaDevice *media); CameraData *cameraData(const Camera *camera); - void setCameraData(const Camera *camera, std::unique_ptr data); + int setCameraData(const Camera *camera, std::unique_ptr data); private: virtual void disconnect(); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index dc55f8f..7e927a7 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -212,21 +212,26 @@ CameraData *PipelineHandler::cameraData(const Camera *camera) * information with \a camera. Ownership of \a data is transferred to * the PipelineHandler. * - * If pipeline-specific data has already been associated with the camera by a - * previous call to this method, is it replaced by \a data and the previous data - * are deleted, rendering all references to them invalid. + * Once pipeline-specific data has already been associated with the camera + * by a previous call to this method it cannot be changed later on. * * The data can be retrieved by pipeline handlers using the cameraData() method. + * + * \return 0 on success, or a negative error code if camera specific data have + * already been set */ -void PipelineHandler::setCameraData(const Camera *camera, - std::unique_ptr data) +int PipelineHandler::setCameraData(const Camera *camera, + std::unique_ptr data) { - if (cameraData_.count(camera)) - LOG(Pipeline, Debug) - << "Replacing data associated with " - << camera->name(); + if (cameraData_.find(camera) != cameraData_.end()) { + LOG(Pipeline, Error) + << "Replacing data associated with a camera is forbidden "; + return -EINVAL; + } cameraData_[camera] = std::move(data); + + return 0; } /**