[libcamera-devel] [PATCH 5/5] libcamera: pipeline: Refuse to substitute camera data
Jacopo Mondi
jacopo at jmondi.org
Fri Jan 25 18:04:00 CET 2019
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 <jacopo at jmondi.org>
---
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<CameraData> data);
+ int setCameraData(const Camera *camera, std::unique_ptr<CameraData> 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<CameraData> data)
+int PipelineHandler::setCameraData(const Camera *camera,
+ std::unique_ptr<CameraData> 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;
}
/**
--
2.20.1
More information about the libcamera-devel
mailing list