From a604cbaad97b6dd7f3f6e1de939b86004fd90f2a Mon Sep 17 00:00:00 2001 From: Pierre-Thomas Meisels Date: Thu, 25 Jan 2024 17:27:04 +0100 Subject: [PATCH] fix: Kill existing user threads except main when closing engine --- .../tests/src/main/kotlin/godot/tests/Invocation.kt | 9 +++++++++ .../src/main/kotlin/godot/runtime/Bootstrap.kt | 1 + src/gd_kotlin.cpp | 11 ++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/harness/tests/src/main/kotlin/godot/tests/Invocation.kt b/harness/tests/src/main/kotlin/godot/tests/Invocation.kt index cb89c5e69..bbfdf3928 100644 --- a/harness/tests/src/main/kotlin/godot/tests/Invocation.kt +++ b/harness/tests/src/main/kotlin/godot/tests/Invocation.kt @@ -41,11 +41,13 @@ import godot.core.asStringName import godot.core.dictionaryOf import godot.core.variantArrayOf import godot.extensions.getNodeAs +import godot.global.GD import godot.registration.Range import godot.signals.signal import godot.tests.subpackage.OtherScript import godot.util.RealT import org.joda.time.DateTime +import kotlin.concurrent.thread enum class TestEnum { ENUM_1, @@ -434,6 +436,13 @@ class Invocation : Node3D() { init { println("Hello Invocation!") + + thread(name = "invocation_thread") { + while (true) { + GD.print("In thread: ${Thread.currentThread()}") + Thread.sleep(1000) + } + } } override fun _onDestroy() { diff --git a/kt/godot-library/src/main/kotlin/godot/runtime/Bootstrap.kt b/kt/godot-library/src/main/kotlin/godot/runtime/Bootstrap.kt index 9ca5ee139..1a0ae82c6 100644 --- a/kt/godot-library/src/main/kotlin/godot/runtime/Bootstrap.kt +++ b/kt/godot-library/src/main/kotlin/godot/runtime/Bootstrap.kt @@ -93,6 +93,7 @@ internal class Bootstrap { watchService?.close() clearClassesCache() serviceLoader.reload() + Thread.currentThread().threadGroup.interrupt() } private fun doInit(mainJar: URL, classLoader: ClassLoader?) { diff --git a/src/gd_kotlin.cpp b/src/gd_kotlin.cpp index ca33cb27b..f940cd670 100644 --- a/src/gd_kotlin.cpp +++ b/src/gd_kotlin.cpp @@ -328,14 +328,11 @@ void GDKotlin::finish() { #endif return; } - auto env = jni::Jvm::current_env(); - - bootstrap->finish(env); delete transfer_context; transfer_context = nullptr; - delete bootstrap; - bootstrap = nullptr; + + auto env = jni::Jvm::current_env(); TypeManager::get_instance().clear(); @@ -358,6 +355,10 @@ void GDKotlin::finish() { garbage_collector_instance.call_void_method(env, clean_up_method_id); } + bootstrap->finish(env); + delete bootstrap; + bootstrap = nullptr; + LongStringQueue::destroy(); BridgesManager::get_instance().delete_bridges(); TypeManager::destroy();