Make sure gchandle bindings are released before cleanup

This commit is contained in:
Ignacio Etcheverry 2017-11-01 01:48:47 +01:00
parent a4ea63737c
commit 06ea441564
2 changed files with 15 additions and 0 deletions

View File

@ -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

View File

@ -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;