Message ID | 20250611142431.33306-1-mzamazal@redhat.com |
---|---|
Headers | show |
Series |
|
Related | show |
Hi 2025. 06. 11. 16:24 keltezéssel, Milan Zamazal írta: > Global configuration is accessed via a GlobalConfiguration instance. > The instance is conceptually a singleton, but singletons are not welcome > in libcamera so we must store the (preferably single) instance > somewhere. > > This patch creates a GlobalConfiguration instance in CameraManager and > defines the corresponding access method. CameraManager is typically > instantiated only once or a few times, it is accessible in > many places in libcamera and the configuration can be retrieved from it > and passed to other places if needed (it's read-only once created). > Using CameraManager for the purpose is still suboptimal and we use it > only due to lack of better options. An alternative could be Logger, > which is still a singleton and it's accessible from everywhere. But > with Logger, we have a chicken and egg problem -- GlobalConfiguration > should log contingent problems with the configuration when it's loaded > but if it is created in the logger then there are mutual infinite > recursive calls. Perhaps some acceptable workaround could be found, > which would also allow an easier logging configuration. > > If there are multiple CameraManager instances, there are also multiple > GlobalConfiguration instances. They may or may not contain the same > data, depending on whether the global configuration file in the file > system was changed in the meantime. This is dirty and a potential > source of trouble (although not expected to have much impact in > practice) but there is no idea how to do better if we want to avoid > having GlobalConfiguration singleton or dealing with the logging > problem. > > The configuration is stored in CameraManager privately, it's not meant > to be accessed by applications. > > Signed-off-by: Milan Zamazal <mzamazal@redhat.com> > --- > include/libcamera/internal/camera_manager.h | 5 +++++ > src/libcamera/camera_manager.cpp | 11 +++++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h > index 0150ca61f..f03fe6343 100644 > --- a/include/libcamera/internal/camera_manager.h > +++ b/include/libcamera/internal/camera_manager.h > @@ -18,6 +18,7 @@ > #include <libcamera/base/thread.h> > #include <libcamera/base/thread_annotations.h> > > +#include "libcamera/internal/global_configuration.h" > #include "libcamera/internal/process.h" > > namespace libcamera { > @@ -38,6 +39,8 @@ public: > void addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_); > void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_); > > + const GlobalConfiguration &configuration() const; It's quite trivial, so could you inline the function? > + > IPAManager *ipaManager() const { return ipaManager_.get(); } > > protected: > @@ -66,6 +69,8 @@ private: > > std::unique_ptr<IPAManager> ipaManager_; > ProcessManager processManager_; > + > + const GlobalConfiguration configuration_{ GlobalConfiguration() }; I think you can omit the `{ GlobalConfiguration() }` part. Regards, Barnabás Pőcze > }; > > } /* namespace libcamera */ > diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp > index e62e7193c..7361915bf 100644 > --- a/src/libcamera/camera_manager.cpp > +++ b/src/libcamera/camera_manager.cpp > @@ -15,6 +15,7 @@ > > #include "libcamera/internal/camera.h" > #include "libcamera/internal/device_enumerator.h" > +#include "libcamera/internal/global_configuration.h" > #include "libcamera/internal/ipa_manager.h" > #include "libcamera/internal/pipeline_handler.h" > > @@ -254,6 +255,16 @@ void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera) > o->cameraRemoved.emit(camera); > } > > +/** > + * \brief Get global configuration bound to the camera manager > + * > + * \return Reference to the configuration > + */ > +const GlobalConfiguration &CameraManager::Private::configuration() const > +{ > + return configuration_; > +} > + > /** > * \fn CameraManager::Private::ipaManager() const > * \brief Retrieve the IPAManager > -- > 2.49.0 >