summaryrefslogtreecommitdiffstats
path: root/chassishandler.cpp
diff options
context:
space:
mode:
authorLei YU <mine260309@gmail.com>2019-01-25 16:43:50 +0800
committerVernon Mauery <vernon.mauery@linux.intel.com>2019-02-12 18:02:40 +0000
commit4b0ddb68b4e76420358589213bc400155fa12e43 (patch)
tree1f439a640b8d6df9799213db644c4a272e6a7f9c /chassishandler.cpp
parentcf059392984d089b9044250e44f7ac039c5b032d (diff)
downloadphosphor-host-ipmid-4b0ddb68b4e76420358589213bc400155fa12e43.tar.gz
phosphor-host-ipmid-4b0ddb68b4e76420358589213bc400155fa12e43.zip
Set init_priority attribute for global variables in shared lib
The code gets unspecified initializatio order for the global/static variables in a shared library. If unluck, a global/static variable may be initialized in *constructor* function, and then initialized by the default contructor. For exmaple, if `std::unique_ptr<xxx> var{nullptr};` is initialized in constructor function, below init order may occur: 1. It is initialized in constructor; 2. Then it is initialized as nullptr; And eventually when the code is to use the variable, we got nullptr. We met such issues before on openbmc/openbmc#1581, and the technical details could be found at [this SO question][1] and [this gcc email][2] The solution is to specify the init_priority attribute, to make the global/staic variables inititalize earlier than the contructors. [1]: https://stackoverflow.com/questions/43941159/global-static-variables-initialization-issue-with-attribute-constructor-i [2]: https://gcc.gnu.org/ml/gcc-patches/2017-03/msg00863.html Change-Id: I901a6a5cddec12aec9512fe58b16735fa2ad90d7 Signed-off-by: Lei YU <mine260309@gmail.com>
Diffstat (limited to 'chassishandler.cpp')
-rw-r--r--chassishandler.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/chassishandler.cpp b/chassishandler.cpp
index 068ad89..c9885bd 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -54,7 +54,8 @@ namespace filesystem = std::experimental::filesystem;
#define SET_PARM_BOOT_FLAGS_VALID_ONE_TIME 0x80
#define SET_PARM_BOOT_FLAGS_VALID_PERMANENT 0xC0
-std::unique_ptr<phosphor::Timer> identifyTimer = nullptr;
+std::unique_ptr<phosphor::Timer> identifyTimer
+ __attribute__((init_priority(101)));
constexpr size_t SIZE_MAC = 18;
constexpr size_t SIZE_BOOT_OPTION = (uint8_t)
OpenPOWER on IntegriCloud