Selaa lähdekoodia

Merge pull request #105192 from Ivorforce/stringname-binary-mutex

Use non-recursive mutex for `StringName`, improving performance
Thaddeus Crews 4 kuukautta sitten
vanhempi
commit
80eba98e9b
4 muutettua tiedostoa jossa 15 lisäystä ja 12 poistoa
  1. 10 0
      core/object/object.cpp
  2. 4 2
      core/object/object.h
  3. 1 8
      core/string/string_name.cpp
  4. 0 2
      core/string/string_name.h

+ 10 - 0
core/object/object.cpp

@@ -2226,6 +2226,16 @@ void Object::detach_from_objectdb() {
 	}
 }
 
+void Object::assign_class_name_static(const Span<char> &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);

+ 4 - 2
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<char> &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;
 	}

+ 1 - 8
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;
 

+ 0 - 2
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