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:
parent
d34cefad17
commit
afc5ea57b4
2 changed files with 23 additions and 6 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue