Browse Source

unified-agent - fix static initialization order problem

unified-agent - fix static initialization order problem
grebelnik 1 year ago
parent
commit
401f957591
1 changed files with 8 additions and 5 deletions
  1. 8 5
      library/cpp/unified_agent_client/enum.h

+ 8 - 5
library/cpp/unified_agent_client/enum.h

@@ -8,23 +8,26 @@ namespace NUnifiedAgent {
         using TEnumNames = TVector<const TString*>;
         using TEnumNames = TVector<const TString*>;
 
 
         template <typename TEnum>
         template <typename TEnum>
-        TEnumNames BuildEnumNames() {
+        TEnumNames* BuildEnumNames() {
             const auto names = GetEnumNames<TEnum>();
             const auto names = GetEnumNames<TEnum>();
-            auto result = TEnumNames(names.size());
+            TEnumNames* result = new TEnumNames(names.size());
             size_t index = 0;
             size_t index = 0;
             for (const auto& p: names) {
             for (const auto& p: names) {
                 Y_VERIFY(static_cast<size_t>(p.first) == index);
                 Y_VERIFY(static_cast<size_t>(p.first) == index);
-                result[index++] = &p.second;
+                (*result)[index++] = &p.second;
             }
             }
             return result;
             return result;
         }
         }
 
 
         template <typename TEnum>
         template <typename TEnum>
-        inline const auto EnumNames = BuildEnumNames<TEnum>();
+        const TEnumNames& EnumNamesVec() {
+            static const TEnumNames* EnumNames = BuildEnumNames<TEnum>();
+            return *EnumNames;
+        }
     }
     }
 
 
     template <typename TEnum, typename = std::enable_if_t<std::is_enum_v<TEnum>>>
     template <typename TEnum, typename = std::enable_if_t<std::is_enum_v<TEnum>>>
     inline const TString& NameOf(TEnum val) noexcept {
     inline const TString& NameOf(TEnum val) noexcept {
-        return *NPrivate::EnumNames<TEnum>[static_cast<size_t>(val)];
+        return *NPrivate::EnumNamesVec<TEnum>()[static_cast<size_t>(val)];
     }
     }
 }
 }