Browse Source

Mono: Make sure editor thread is attached on script reload

Ignacio Etcheverry 8 năm trước cách đây
mục cha
commit
fdc3de009c
1 tập tin đã thay đổi với 25 bổ sung0 xóa
  1. 25 0
      modules/mono/csharp_script.cpp

+ 25 - 0
modules/mono/csharp_script.cpp

@@ -1795,6 +1795,31 @@ RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p
 #endif
 
 	script->set_path(p_original_path);
+
+#ifndef TOOLS_ENABLED
+
+#ifdef DEBUG_ENABLED
+	// User is responsible for thread attach/detach
+	ERR_EXPLAIN("Thread is not attached");
+	CRASH_COND(mono_domain_get() == NULL);
+#endif
+
+#else
+	if (Engine::get_singleton()->is_editor_hint() && mono_domain_get() == NULL) {
+
+		CRASH_COND(Thread::get_caller_id() == Thread::get_main_id());
+
+		// Thread is not attached, but we will make an exception in this case
+		// because this may be called by one of the editor's worker threads.
+		// Attach this thread temporarily to reload the script.
+
+		MonoThread *mono_thread = mono_thread_attach(SCRIPTS_DOMAIN);
+		CRASH_COND(mono_thread == NULL);
+		script->reload();
+		mono_thread_detach(mono_thread);
+
+	} else // just reload it normally
+#endif
 	script->reload();
 
 	if (r_error)