From 874b442a13fbfcda4fc7e4f4edb1df1555383330 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 23 Nov 2021 10:47:04 +0500 Subject: [PATCH] [K/N][gradle] Automatic cleaning of the class loaders map --- kotlin-native/build.gradle | 4 ++++ .../kotlin/gradle/plugin/konan/KonanToolRunner.kt | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 59b9037a956..e6716852ffe 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.CompareDistributionSignatures import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.apache.tools.ant.filters.ReplaceTokens import org.jetbrains.kotlin.UtilsKt +import java.util.concurrent.ConcurrentHashMap buildscript { apply from: "gradle/kotlinGradlePlugin.gradle" @@ -95,6 +96,9 @@ ext { konanVersionFull = ext.kotlinNativeVersion gradlePluginVersion = konanVersionFull + + // A separate map for each build for automatic cleaning the daemon after the build have finished. + toolClassLoadersMap = new ConcurrentHashMap() } allprojects { diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt index 6604440cb71..30f1527d789 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt @@ -28,6 +28,8 @@ import java.io.File import java.util.Properties import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner import org.jetbrains.kotlin.konan.target.AbstractToolConfig +import java.net.URLClassLoader +import java.util.concurrent.ConcurrentHashMap internal interface KonanToolRunner { fun run(args: List) @@ -68,10 +70,15 @@ internal abstract class KonanCliRunner( """.trimIndent() } - data class IsolatedClassLoaderCacheKey(val classpath: Set, val project: Project) + data class IsolatedClassLoaderCacheKey(val classpath: Set) // TODO: can't we use this for other implementations too? - final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath, project) + final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath) + + // A separate map for each build for automatic cleaning the daemon after the build have finished. + @Suppress("UNCHECKED_CAST") + final override val isolatedClassLoaders get() = + project.project(":kotlin-native").ext["toolClassLoadersMap"] as ConcurrentHashMap override fun transformArgs(args: List) = listOf(toolName) + args @@ -110,6 +117,9 @@ private val load0 = Runtime::class.java.getDeclaredMethod("load0", Class::class. internal class CliToolConfig(konanHome: String, target: String) : AbstractToolConfig(konanHome, target, emptyMap()) { override fun loadLibclang() { + // Load libclang into the system class loader. This is needed to allow developers to make changes + // in the tooling infrastructure without having to stop the daemon (otherwise libclang might end up + // loaded in two different class loaders which is not allowed by the JVM). load0.invoke(Runtime.getRuntime(), String::class.java, libclang) } }