[PATCH v5 04/15] config: Look up logging levels in the configuration file

Milan Zamazal mzamazal at redhat.com
Thu Dec 5 14:26:53 CET 2024


Hi Barnabás,

Barnabás Pőcze <pobrn at protonmail.com> writes:

> Hi
>
>
> 2024. október 1., kedd 12:27 keltezéssel, Milan Zamazal <mzamazal at redhat.com> írta:
>
>> In addition to LIBCAMERA_LOG_LEVELS environment variable, expose the
>> same configuration in the configuration file.
>> 
>> Because logging asks for configuration and configuration loading uses
>> logging, extra care is needed.  We must prevent calling any log function
>> before configuration is loaded.  Otherwise the log function would ask
>> for configuration, it would load the configuration files and would try
>> to log the results.  Which can lead to various breakages, even quite
>> subtle; this has been demonstrated in camera_reconfigure test when
>> trying to make the configuration initialization more transparent, as a
>> static variable instance with automatic initialization rather than a
>> pointer with manual initialization() invocation.
>> 
>> But we must log at least errors when reading the configuration.
>> Especially, we cannot prevent logging in configuration initialization
>> entirely because the YAML parser may log errors.  But in case of an
>> error during configuration initialization, the configuration cannot be
>> read anyway and the statically created initial global configuration
>> instance serves the purpose of providing some, empty configuration.
>> Then the errors from the YAML parser can be logged.
>> 
>> We cannot use the same mechanism for other logging in configuration
>> initialization because then logging would read and use the empty
>> configuration, which is not a valid configuration this time, for the
>> whole run of libcamera.
>> 
>> The configuration must be initialized, which is done by calling
>> initialize() method in IPAManager constructor.  A more suitable place
>> would be CameraManager constructor but it would be too late there, the
>> IPAManager constructor is called earlier.
>> 
>> The configuration snippet for logging looks as follows:
>> 
>>   configuration:
>>     log:
>>       levels: LIBCAMERA_LOG_LEVELS
>> 
>> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> ---
>> [...]
>> diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
>> index cfc24d389..33ae74e8f 100644
>> --- a/src/libcamera/ipa_manager.cpp
>> +++ b/src/libcamera/ipa_manager.cpp
>> @@ -16,6 +16,7 @@
>>  #include <libcamera/base/log.h>
>>  #include <libcamera/base/utils.h>
>> 
>> +#include "libcamera/internal/global_configuration.h"
>>  #include "libcamera/internal/ipa_module.h"
>>  #include "libcamera/internal/ipa_proxy.h"
>>  #include "libcamera/internal/pipeline_handler.h"
>> @@ -103,6 +104,8 @@ LOG_DEFINE_CATEGORY(IPAManager)
>>   */
>>  IPAManager::IPAManager()
>>  {
>> +	GlobalConfiguration::initialize();
>> [...]
>
> This looks very fragile. I think there is an appreciable risk of an unrelated change
> upsetting the order of construction so that this no longer works as expected.

Yes, but does anybody have any idea how to do better?

> Regards,
> Barnabás Pőcze



More information about the libcamera-devel mailing list