Răsfoiți Sursa

Uninitialized local and domain finalize fixes
- Make sure to run the GC before and after finalizing the scripts domain.

Ignacio Etcheverry 8 ani în urmă
părinte
comite
1d309439cb
1 a modificat fișierele cu 6 adăugiri și 1 ștergeri
  1. 6 1
      modules/mono/mono_gd/gd_mono.cpp

+ 6 - 1
modules/mono/mono_gd/gd_mono.cpp

@@ -31,6 +31,7 @@
 
 #include <mono/metadata/mono-config.h>
 #include <mono/metadata/mono-debug.h>
+#include <mono/metadata/mono-gc.h>
 
 #include "os/dir_access.h"
 #include "os/file_access.h"
@@ -272,7 +273,7 @@ bool GDMono::_load_assembly(const String &p_name, GDMonoAssembly **r_assembly) {
 	if (OS::get_singleton()->is_stdout_verbose())
 		OS::get_singleton()->print((String() + "Mono: Loading assembly " + p_name + "...\n").utf8());
 
-	MonoImageOpenStatus status;
+	MonoImageOpenStatus status = MONO_IMAGE_OK;
 	MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8());
 	MonoAssembly *assembly = mono_assembly_load_full(aname, NULL, &status, false);
 	mono_assembly_name_free(aname);
@@ -438,10 +439,14 @@ Error GDMono::_unload_scripts_domain() {
 	if (mono_domain_get() != root_domain)
 		mono_domain_set(root_domain, true);
 
+	mono_gc_collect(mono_gc_max_generation());
+
 	finalizing_scripts_domain = true;
 	mono_domain_finalize(scripts_domain, 2000);
 	finalizing_scripts_domain = false;
 
+	mono_gc_collect(mono_gc_max_generation());
+
 	_domain_assemblies_cleanup(mono_domain_get_id(scripts_domain));
 
 	api_assembly = NULL;