ipa: raspberrypi: Fix crash under LTO

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@canonical.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Dave Jones 2023-03-10 11:39:11 +00:00 committed by Kieran Bingham
parent d34cefad17
commit afc5ea57b4
2 changed files with 23 additions and 6 deletions

View file

@ -25,7 +25,15 @@ namespace libcamera {
LOG_DECLARE_CATEGORY(IPARPI) 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) CamHelper *CamHelper::create(std::string const &camName)
{ {
@ -33,7 +41,7 @@ CamHelper *CamHelper::create(std::string const &camName)
* CamHelpers get registered by static RegisterCamHelper * CamHelpers get registered by static RegisterCamHelper
* initialisers. * initialisers.
*/ */
for (auto &p : camHelpers) { for (auto &p : camHelpers()) {
if (camName.find(p.first) != std::string::npos) if (camName.find(p.first) != std::string::npos)
return p.second(); return p.second();
} }
@ -253,5 +261,5 @@ void CamHelper::populateMetadata([[maybe_unused]] const MdParser::RegisterMap &r
RegisterCamHelper::RegisterCamHelper(char const *camName, RegisterCamHelper::RegisterCamHelper(char const *camName,
CamHelperCreateFunc createFunc) CamHelperCreateFunc createFunc)
{ {
camHelpers[std::string(camName)] = createFunc; camHelpers()[std::string(camName)] = createFunc;
} }

View file

@ -34,14 +34,23 @@ void Algorithm::process([[maybe_unused]] StatisticsPtr &stats,
/* For registering algorithms with the system: */ /* For registering algorithms with the system: */
static std::map<std::string, AlgoCreateFunc> algorithms; 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() std::map<std::string, AlgoCreateFunc> const &RPiController::getAlgorithms()
{ {
return algorithms; return algorithms();
} }
RegisterAlgorithm::RegisterAlgorithm(char const *name, RegisterAlgorithm::RegisterAlgorithm(char const *name,
AlgoCreateFunc createFunc) AlgoCreateFunc createFunc)
{ {
algorithms[std::string(name)] = createFunc; algorithms()[std::string(name)] = createFunc;
} }