Przeglądaj źródła

Make sure gchandle bindings are released before cleanup

Ignacio Etcheverry 8 lat temu
rodzic
commit
06ea441564
2 zmienionych plików z 15 dodań i 0 usunięć
  1. 11 0
      modules/mono/csharp_script.cpp
  2. 4 0
      modules/mono/mono_gc_handle.cpp

+ 11 - 0
modules/mono/csharp_script.cpp

@@ -122,6 +122,9 @@ void CSharpLanguage::init() {
 
 void CSharpLanguage::finish() {
 
+	// Release gchandle bindings before finalizing mono runtime
+	gchandle_bindings.clear();
+
 	if (gdmono) {
 		memdelete(gdmono);
 		gdmono = NULL;
@@ -794,6 +797,14 @@ void *CSharpLanguage::alloc_instance_binding_data(Object *p_object) {
 
 void CSharpLanguage::free_instance_binding_data(void *p_data) {
 
+	if (GDMono::get_singleton() == NULL) {
+#ifdef DEBUG_ENABLED
+		CRASH_COND(!gchandle_bindings.empty());
+#endif
+		// Mono runtime finalized, all the gchandle bindings were already released
+		return;
+	}
+
 #ifndef NO_THREADS
 	script_bind_lock->lock();
 #endif

+ 4 - 0
modules/mono/mono_gc_handle.cpp

@@ -59,6 +59,10 @@ Ref<MonoGCHandle> MonoGCHandle::create_weak(MonoObject *p_object) {
 
 void MonoGCHandle::release() {
 
+#ifdef DEBUG_ENABLED
+	CRASH_COND(GDMono::get_singleton() == NULL);
+#endif
+
 	if (!released && GDMono::get_singleton()->is_runtime_initialized()) {
 		mono_gchandle_free(handle);
 		released = true;