From e57427900ff57c5ecf316488854a5e13290a37c5 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Wed, 9 Apr 2025 14:53:16 +0200 Subject: [PATCH] Use `BinaryMutex` instead of `Mutex` for `StringName`. --- core/object/object.cpp | 10 ++++++++++ core/object/object.h | 6 ++++-- core/string/string_name.cpp | 9 +-------- core/string/string_name.h | 2 -- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/core/object/object.cpp b/core/object/object.cpp index 41108bacbbc..d08095e8b9c 100644 --- a/core/object/object.cpp +++ b/core/object/object.cpp @@ -2226,6 +2226,16 @@ void Object::detach_from_objectdb() { } } +void Object::assign_class_name_static(const Span &p_name, StringName &r_target) { + static BinaryMutex _mutex; + MutexLock lock(_mutex); + if (r_target) { + // Already assigned while we were waiting for the mutex. + return; + } + r_target = StringName(p_name.ptr(), true); +} + Object::~Object() { if (script_instance) { memdelete(script_instance); diff --git a/core/object/object.h b/core/object/object.h index c53fd8458bb..d819c24f812 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -425,7 +425,7 @@ public: static const StringName &get_class_static() { \ static StringName _class_name_static; \ if (unlikely(!_class_name_static)) { \ - StringName::assign_static_unique_class_name(&_class_name_static, #m_class); \ + assign_class_name_static(#m_class, _class_name_static); \ } \ return _class_name_static; \ } \ @@ -811,10 +811,12 @@ public: }; /* TYPE API */ + static void assign_class_name_static(const Span &p_name, StringName &r_target); + static const StringName &get_class_static() { static StringName _class_name_static; if (unlikely(!_class_name_static)) { - StringName::assign_static_unique_class_name(&_class_name_static, "Object"); + assign_class_name_static("Object", _class_name_static); } return _class_name_static; } diff --git a/core/string/string_name.cpp b/core/string/string_name.cpp index ecf9cfc33c2..208c63f07fe 100644 --- a/core/string/string_name.cpp +++ b/core/string/string_name.cpp @@ -39,7 +39,7 @@ struct StringName::Table { constexpr static uint32_t TABLE_MASK = TABLE_LEN - 1; static inline _Data *table[TABLE_LEN]; - static inline Mutex mutex; + static inline BinaryMutex mutex; static inline PagedAllocator<_Data> allocator; }; @@ -208,13 +208,6 @@ StringName::StringName(const StringName &p_name) { } } -void StringName::assign_static_unique_class_name(StringName *ptr, const char *p_name) { - MutexLock lock(Table::mutex); - if (*ptr == StringName()) { - *ptr = StringName(p_name, true); - } -} - StringName::StringName(const char *p_name, bool p_static) { _data = nullptr; diff --git a/core/string/string_name.h b/core/string/string_name.h index 319c863e793..cb9a50ab53a 100644 --- a/core/string/string_name.h +++ b/core/string/string_name.h @@ -178,8 +178,6 @@ public: StringName(const String &p_name, bool p_static = false); StringName() {} - static void assign_static_unique_class_name(StringName *ptr, const char *p_name); - #ifdef SIZE_EXTRA _NO_INLINE_ #else