extensions: Deterministic global construction ordering

Right now, we have an issue where the global variables owned by
extensions.cpp are not necessarily constructed before other objects try
and use them in their own global constructors. We need to gate access on
functions that guarantee the object is constructed before it is used.

Change-Id: I71f88a901c21b9121a25e3ccd365d2a74a9be709
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/extensions.cpp b/extensions.cpp
index fa68789..2fc8792 100644
--- a/extensions.cpp
+++ b/extensions.cpp
@@ -1,22 +1,39 @@
 #include "extensions.hpp"
 
-// The 'extensions_test' testcase needs to define these itself.
-// Skip over the definition to avoid duplicate symbol definitions.
-#ifndef TESTCASE_extensions_test
-
 namespace phosphor
 {
 namespace logging
 {
 
-StartupFunctions Extensions::startupFunctions{};
-CreateFunctions Extensions::createFunctions{};
-DeleteFunctions Extensions::deleteFunctions{};
-DeleteProhibitedFunctions Extensions::deleteProhibitedFunctions{};
-Extensions::DefaultErrorCaps Extensions::defaultErrorCaps =
-    Extensions::DefaultErrorCaps::enable;
+StartupFunctions& Extensions::getStartupFunctions()
+{
+    static StartupFunctions startupFunctions{};
+    return startupFunctions;
+}
+
+CreateFunctions& Extensions::getCreateFunctions()
+{
+    static CreateFunctions createFunctions{};
+    return createFunctions;
+}
+
+DeleteFunctions& Extensions::getDeleteFunctions()
+{
+    static DeleteFunctions deleteFunctions{};
+    return deleteFunctions;
+}
+
+DeleteProhibitedFunctions& Extensions::getDeleteProhibitedFunctions()
+{
+    static DeleteProhibitedFunctions deleteProhibitedFunctions{};
+    return deleteProhibitedFunctions;
+}
+
+Extensions::DefaultErrorCaps& Extensions::getDefaultErrorCaps()
+{
+    static DefaultErrorCaps defaultErrorCaps = DefaultErrorCaps::enable;
+    return defaultErrorCaps;
+}
 
 } // namespace logging
 } // namespace phosphor
-
-#endif