StringName: Use inline static field definitions

Before this change StringName used regular static field
definitions for its mutex, _table, configured and debug_stringname
fields.

Since in the general case the ordering of the static variable and field
initialization and destruction is undefined, it was possible that
the destruction of StringName's static fields happened prior to
the destruction of statically allocated StringName instances.

By changing the static field definitions to inline in string_name.h,
the C++17 standard guarantees the correct initialization and destruction
ordering.

(cherry picked from commit 723878bbab)
This commit is contained in:
Gergely Kis 2024-07-23 01:53:02 +02:00 committed by Rémi Verschelde
parent cff0ebd603
commit bf5907b724
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 4 additions and 13 deletions

View File

@ -39,19 +39,10 @@ StaticCString StaticCString::create(const char *p_ptr) {
return scs; return scs;
} }
StringName::_Data *StringName::_table[STRING_TABLE_LEN];
StringName _scs_create(const char *p_chr, bool p_static) { StringName _scs_create(const char *p_chr, bool p_static) {
return (p_chr[0] ? StringName(StaticCString::create(p_chr), p_static) : StringName()); return (p_chr[0] ? StringName(StaticCString::create(p_chr), p_static) : StringName());
} }
bool StringName::configured = false;
Mutex StringName::mutex;
#ifdef DEBUG_ENABLED
bool StringName::debug_stringname = false;
#endif
void StringName::setup() { void StringName::setup() {
ERR_FAIL_COND(configured); ERR_FAIL_COND(configured);
for (int i = 0; i < STRING_TABLE_LEN; i++) { for (int i = 0; i < STRING_TABLE_LEN; i++) {

View File

@ -67,7 +67,7 @@ class StringName {
_Data() {} _Data() {}
}; };
static _Data *_table[STRING_TABLE_LEN]; static inline _Data *_table[STRING_TABLE_LEN];
_Data *_data = nullptr; _Data *_data = nullptr;
@ -75,10 +75,10 @@ class StringName {
friend void register_core_types(); friend void register_core_types();
friend void unregister_core_types(); friend void unregister_core_types();
friend class Main; friend class Main;
static Mutex mutex; static inline Mutex mutex;
static void setup(); static void setup();
static void cleanup(); static void cleanup();
static bool configured; static inline bool configured = false;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
struct DebugSortReferences { struct DebugSortReferences {
bool operator()(const _Data *p_left, const _Data *p_right) const { bool operator()(const _Data *p_left, const _Data *p_right) const {
@ -86,7 +86,7 @@ class StringName {
} }
}; };
static bool debug_stringname; static inline bool debug_stringname = false;
#endif #endif
StringName(_Data *p_data) { _data = p_data; } StringName(_Data *p_data) { _data = p_data; }