Jelajahi Sumber

Merge pull request #70850 from bruvzg/ts_tsafe_free

[TextServer] Make `free` calls thread safe.
Rémi Verschelde 2 tahun lalu
induk
melakukan
96f12040c9

+ 8 - 2
modules/text_server_adv/text_server_adv.cpp

@@ -385,11 +385,17 @@ void TextServerAdvanced::_free_rid(const RID &p_rid) {
 	_THREAD_SAFE_METHOD_
 	_THREAD_SAFE_METHOD_
 	if (font_owner.owns(p_rid)) {
 	if (font_owner.owns(p_rid)) {
 		FontAdvanced *fd = font_owner.get_or_null(p_rid);
 		FontAdvanced *fd = font_owner.get_or_null(p_rid);
-		font_owner.free(p_rid);
+		{
+			MutexLock lock(fd->mutex);
+			font_owner.free(p_rid);
+		}
 		memdelete(fd);
 		memdelete(fd);
 	} else if (shaped_owner.owns(p_rid)) {
 	} else if (shaped_owner.owns(p_rid)) {
 		ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_rid);
 		ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_rid);
-		shaped_owner.free(p_rid);
+		{
+			MutexLock lock(sd->mutex);
+			shaped_owner.free(p_rid);
+		}
 		memdelete(sd);
 		memdelete(sd);
 	}
 	}
 }
 }

+ 8 - 2
modules/text_server_fb/text_server_fb.cpp

@@ -115,11 +115,17 @@ void TextServerFallback::_free_rid(const RID &p_rid) {
 	_THREAD_SAFE_METHOD_
 	_THREAD_SAFE_METHOD_
 	if (font_owner.owns(p_rid)) {
 	if (font_owner.owns(p_rid)) {
 		FontFallback *fd = font_owner.get_or_null(p_rid);
 		FontFallback *fd = font_owner.get_or_null(p_rid);
-		font_owner.free(p_rid);
+		{
+			MutexLock lock(fd->mutex);
+			font_owner.free(p_rid);
+		}
 		memdelete(fd);
 		memdelete(fd);
 	} else if (shaped_owner.owns(p_rid)) {
 	} else if (shaped_owner.owns(p_rid)) {
 		ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_rid);
 		ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_rid);
-		shaped_owner.free(p_rid);
+		{
+			MutexLock lock(sd->mutex);
+			shaped_owner.free(p_rid);
+		}
 		memdelete(sd);
 		memdelete(sd);
 	}
 	}
 }
 }