[libcamera-devel] [PATCH v2] ipa: raspberrypi: Fix crash under LTO
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Mar 10 12:41:59 CET 2023
Hi Naush and Dave,
Thank you for the patch.
On Fri, Mar 10, 2023 at 11:39:11AM +0000, Naushir Patuck via libcamera-devel wrote:
> From: Dave Jones <dave.jones at canonical.com>
>
> When compiled with LTO (the default on Ubuntu), the global static
> objects camHelpers and algorithms cause a crash in raspberrypi_ipa_proxy
> at runtime as they're not allocated by the time the registration
> routines execute.
>
> This is a fairly crude fix which just converts the global static objects
> into local static objects inside an equivalently named function.
>
> Signed-off-by: Dave Jones <dave.jones at canonical.com>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> Tested-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/raspberrypi/cam_helper.cpp | 14 +++++++++++---
> src/ipa/raspberrypi/controller/algorithm.cpp | 15 ++++++++++++---
> 2 files changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp
> index d90ac1deda47..ddd5e9a4fef2 100644
> --- a/src/ipa/raspberrypi/cam_helper.cpp
> +++ b/src/ipa/raspberrypi/cam_helper.cpp
> @@ -25,7 +25,15 @@ namespace libcamera {
> LOG_DECLARE_CATEGORY(IPARPI)
> }
>
> -static std::map<std::string, CamHelperCreateFunc> camHelpers;
> +namespace {
> +
> +std::map<std::string, CamHelperCreateFunc> &camHelpers()
> +{
> + static std::map<std::string, CamHelperCreateFunc> helpers;
> + return helpers;
> +}
> +
> +} /* namespace */
>
> CamHelper *CamHelper::create(std::string const &camName)
> {
> @@ -33,7 +41,7 @@ CamHelper *CamHelper::create(std::string const &camName)
> * CamHelpers get registered by static RegisterCamHelper
> * initialisers.
> */
> - for (auto &p : camHelpers) {
> + for (auto &p : camHelpers()) {
> if (camName.find(p.first) != std::string::npos)
> return p.second();
> }
> @@ -253,5 +261,5 @@ void CamHelper::populateMetadata([[maybe_unused]] const MdParser::RegisterMap &r
> RegisterCamHelper::RegisterCamHelper(char const *camName,
> CamHelperCreateFunc createFunc)
> {
> - camHelpers[std::string(camName)] = createFunc;
> + camHelpers()[std::string(camName)] = createFunc;
> }
> diff --git a/src/ipa/raspberrypi/controller/algorithm.cpp b/src/ipa/raspberrypi/controller/algorithm.cpp
> index 6d91ee292bd1..a957fde520c2 100644
> --- a/src/ipa/raspberrypi/controller/algorithm.cpp
> +++ b/src/ipa/raspberrypi/controller/algorithm.cpp
> @@ -34,14 +34,23 @@ void Algorithm::process([[maybe_unused]] StatisticsPtr &stats,
>
> /* For registering algorithms with the system: */
>
> -static std::map<std::string, AlgoCreateFunc> algorithms;
> -std::map<std::string, AlgoCreateFunc> const &RPiController::getAlgorithms()
> +namespace {
> +
> +std::map<std::string, AlgoCreateFunc> &algorithms()
> {
> + static std::map<std::string, AlgoCreateFunc> algorithms;
> return algorithms;
> }
>
> +} /* namespace */
> +
> +std::map<std::string, AlgoCreateFunc> const &RPiController::getAlgorithms()
> +{
> + return algorithms();
> +}
> +
> RegisterAlgorithm::RegisterAlgorithm(char const *name,
> AlgoCreateFunc createFunc)
> {
> - algorithms[std::string(name)] = createFunc;
> + algorithms()[std::string(name)] = createFunc;
> }
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list