[K/N] Keep isolatedClassLoaders in a build service
This commit is contained in:
committed by
Space Team
parent
3532056e0d
commit
23710ac133
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.konan
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.Task
|
||||
import org.gradle.api.services.BuildService
|
||||
import org.gradle.api.services.BuildServiceParameters
|
||||
import org.gradle.kotlin.dsl.registerIfAbsent
|
||||
import java.net.URLClassLoader
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
abstract class KonanCliRunnerIsolatedClassLoadersService : BuildService<BuildServiceParameters.None>, AutoCloseable {
|
||||
val isolatedClassLoaders = ConcurrentHashMap<Any, URLClassLoader>()
|
||||
|
||||
override fun close() {
|
||||
isolatedClassLoaders.clear()
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun registerIfAbsent(project: Project) = project.gradle.sharedServices.registerIfAbsent("KonanCliRunnerIsolatedClassLoadersService", KonanCliRunnerIsolatedClassLoadersService::class.java) {}
|
||||
|
||||
fun attachingToTask(task: Task): KonanCliRunnerIsolatedClassLoadersService {
|
||||
val service = registerIfAbsent(task.project)
|
||||
task.usesService(service)
|
||||
return service.get()
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-13
@@ -11,15 +11,12 @@ import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin.ProjectProperty.KONA
|
||||
import org.jetbrains.kotlin.konan.target.HostManager
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
import java.nio.file.Files
|
||||
import org.jetbrains.kotlin.*
|
||||
import org.jetbrains.kotlin.konan.properties.resolvablePropertyString
|
||||
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
||||
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<String>)
|
||||
@@ -33,6 +30,7 @@ private const val runFromDaemonPropertyName = "kotlin.native.tool.runFromDaemon"
|
||||
internal abstract class KonanCliRunner(
|
||||
protected val toolName: String,
|
||||
project: Project,
|
||||
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||
val additionalJvmArgs: List<String> = emptyList(),
|
||||
val konanHome: String = project.konanHome
|
||||
) : KotlinToolRunner(project), KonanToolRunner {
|
||||
@@ -79,8 +77,7 @@ internal abstract class KonanCliRunner(
|
||||
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 = project.project(":kotlin-native").ext["toolClassLoadersMap"] as ConcurrentHashMap<Any, URLClassLoader>
|
||||
final override val isolatedClassLoaders = isolatedClassLoadersService.isolatedClassLoaders
|
||||
|
||||
override fun transformArgs(args: List<String>) = listOf(toolName) + args
|
||||
|
||||
@@ -90,10 +87,11 @@ internal abstract class KonanCliRunner(
|
||||
/** Kotlin/Native compiler runner */
|
||||
internal class KonanCliCompilerRunner(
|
||||
project: Project,
|
||||
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||
additionalJvmArgs: List<String> = emptyList(),
|
||||
val useArgFile: Boolean = true,
|
||||
konanHome: String = project.konanHome
|
||||
) : KonanCliRunner("konanc", project, additionalJvmArgs, konanHome) {
|
||||
) : KonanCliRunner("konanc", project, isolatedClassLoadersService, additionalJvmArgs, konanHome) {
|
||||
override fun transformArgs(args: List<String>): List<String> {
|
||||
if (!useArgFile) return super.transformArgs(args)
|
||||
|
||||
@@ -127,9 +125,10 @@ internal class CliToolConfig(konanHome: String, target: String) : AbstractToolCo
|
||||
/** Kotlin/Native C-interop tool runner */
|
||||
internal class KonanCliInteropRunner(
|
||||
private val project: Project,
|
||||
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||
additionalJvmArgs: List<String> = emptyList(),
|
||||
konanHome: String = project.konanHome
|
||||
) : KonanCliRunner("cinterop", project, additionalJvmArgs, konanHome) {
|
||||
) : KonanCliRunner("cinterop", project, isolatedClassLoadersService, additionalJvmArgs, konanHome) {
|
||||
private val projectDir = project.projectDir.toString()
|
||||
|
||||
override val mustRunViaExec: Boolean
|
||||
@@ -173,9 +172,3 @@ internal class KonanCliInteropRunner(
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
internal class KonanKlibRunner(
|
||||
project: Project,
|
||||
additionalJvmArgs: List<String> = emptyList(),
|
||||
konanHome: String = project.konanHome
|
||||
) : KonanCliRunner("klib", project, additionalJvmArgs, konanHome)
|
||||
|
||||
+4
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.konan.target.Distribution
|
||||
import org.jetbrains.kotlin.konan.target.PlatformManager
|
||||
import org.jetbrains.kotlin.library.uniqueName
|
||||
import org.jetbrains.kotlin.*
|
||||
import org.jetbrains.kotlin.gradle.plugin.konan.KonanCliRunnerIsolatedClassLoadersService
|
||||
import org.jetbrains.kotlin.util.Logger
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
@@ -82,6 +83,8 @@ abstract class KonanCacheTask : DefaultTask() {
|
||||
@get:Input
|
||||
var cachedLibraries: Map<File, File> = emptyMap()
|
||||
|
||||
private val isolatedClassLoadersService = KonanCliRunnerIsolatedClassLoadersService.attachingToTask(this)
|
||||
|
||||
@TaskAction
|
||||
fun compile() {
|
||||
// This code uses bootstrap version of util-klib and fails due to the older default ABI than library being used
|
||||
@@ -112,6 +115,6 @@ abstract class KonanCacheTask : DefaultTask() {
|
||||
args += "-Xmake-per-file-cache"
|
||||
args += additionalCacheFlags
|
||||
args += cachedLibraries.map { "-Xcached-library=${it.key},${it.value}" }
|
||||
KonanCliCompilerRunner(project, konanHome = konanHome).run(args)
|
||||
KonanCliCompilerRunner(project, isolatedClassLoadersService, konanHome = konanHome).run(args)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -22,7 +22,7 @@ import javax.inject.Inject
|
||||
abstract class KonanCompileTask @Inject constructor(private val layout: ProjectLayout): KonanBuildingTask(), KonanCompileSpec {
|
||||
|
||||
@get:Internal
|
||||
override val toolRunner = KonanCliCompilerRunner(project, project.konanExtension.jvmArgs)
|
||||
override val toolRunner = KonanCliCompilerRunner(project, KonanCliRunnerIsolatedClassLoadersService.attachingToTask(this), project.konanExtension.jvmArgs)
|
||||
|
||||
abstract val produce: CompilerOutputKind
|
||||
@Internal get
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ import javax.inject.Inject
|
||||
|
||||
abstract class KonanInteropTask @Inject constructor(private val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
|
||||
|
||||
private val interopRunner = KonanCliInteropRunner(project, project.konanExtension.jvmArgs)
|
||||
private val interopRunner = KonanCliInteropRunner(project, KonanCliRunnerIsolatedClassLoadersService.attachingToTask(this), project.konanExtension.jvmArgs)
|
||||
|
||||
@get:Internal
|
||||
override val toolRunner: KonanToolRunner = interopRunner
|
||||
|
||||
@@ -63,9 +63,6 @@ ext {
|
||||
|
||||
cacheableTargetNames = platformManager.hostPlatform.cacheableTargets
|
||||
cacheableTargets = cacheableTargetNames.collect { platformManager.targetByName(it) }
|
||||
|
||||
// A separate map for each build for automatic cleaning the daemon after the build have finished.
|
||||
toolClassLoadersMap = new ConcurrentHashMap<Object, URLClassLoader>()
|
||||
}
|
||||
|
||||
allprojects {
|
||||
|
||||
Reference in New Issue
Block a user