[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.HostManager
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import org.jetbrains.kotlin.*
|
|
||||||
import org.jetbrains.kotlin.konan.properties.resolvablePropertyString
|
import org.jetbrains.kotlin.konan.properties.resolvablePropertyString
|
||||||
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
import org.jetbrains.kotlin.konan.util.DependencyDirectories
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
|
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
|
||||||
import org.jetbrains.kotlin.konan.target.AbstractToolConfig
|
import org.jetbrains.kotlin.konan.target.AbstractToolConfig
|
||||||
import java.net.URLClassLoader
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
|
||||||
|
|
||||||
internal interface KonanToolRunner {
|
internal interface KonanToolRunner {
|
||||||
fun run(args: List<String>)
|
fun run(args: List<String>)
|
||||||
@@ -33,6 +30,7 @@ private const val runFromDaemonPropertyName = "kotlin.native.tool.runFromDaemon"
|
|||||||
internal abstract class KonanCliRunner(
|
internal abstract class KonanCliRunner(
|
||||||
protected val toolName: String,
|
protected val toolName: String,
|
||||||
project: Project,
|
project: Project,
|
||||||
|
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||||
val additionalJvmArgs: List<String> = emptyList(),
|
val additionalJvmArgs: List<String> = emptyList(),
|
||||||
val konanHome: String = project.konanHome
|
val konanHome: String = project.konanHome
|
||||||
) : KotlinToolRunner(project), KonanToolRunner {
|
) : KotlinToolRunner(project), KonanToolRunner {
|
||||||
@@ -79,8 +77,7 @@ internal abstract class KonanCliRunner(
|
|||||||
final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath)
|
final override val isolatedClassLoaderCacheKey get() = IsolatedClassLoaderCacheKey(classpath)
|
||||||
|
|
||||||
// A separate map for each build for automatic cleaning the daemon after the build have finished.
|
// A separate map for each build for automatic cleaning the daemon after the build have finished.
|
||||||
@Suppress("UNCHECKED_CAST")
|
final override val isolatedClassLoaders = isolatedClassLoadersService.isolatedClassLoaders
|
||||||
final override val isolatedClassLoaders = project.project(":kotlin-native").ext["toolClassLoadersMap"] as ConcurrentHashMap<Any, URLClassLoader>
|
|
||||||
|
|
||||||
override fun transformArgs(args: List<String>) = listOf(toolName) + args
|
override fun transformArgs(args: List<String>) = listOf(toolName) + args
|
||||||
|
|
||||||
@@ -90,10 +87,11 @@ internal abstract class KonanCliRunner(
|
|||||||
/** Kotlin/Native compiler runner */
|
/** Kotlin/Native compiler runner */
|
||||||
internal class KonanCliCompilerRunner(
|
internal class KonanCliCompilerRunner(
|
||||||
project: Project,
|
project: Project,
|
||||||
|
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||||
additionalJvmArgs: List<String> = emptyList(),
|
additionalJvmArgs: List<String> = emptyList(),
|
||||||
val useArgFile: Boolean = true,
|
val useArgFile: Boolean = true,
|
||||||
konanHome: String = project.konanHome
|
konanHome: String = project.konanHome
|
||||||
) : KonanCliRunner("konanc", project, additionalJvmArgs, konanHome) {
|
) : KonanCliRunner("konanc", project, isolatedClassLoadersService, additionalJvmArgs, konanHome) {
|
||||||
override fun transformArgs(args: List<String>): List<String> {
|
override fun transformArgs(args: List<String>): List<String> {
|
||||||
if (!useArgFile) return super.transformArgs(args)
|
if (!useArgFile) return super.transformArgs(args)
|
||||||
|
|
||||||
@@ -127,9 +125,10 @@ internal class CliToolConfig(konanHome: String, target: String) : AbstractToolCo
|
|||||||
/** Kotlin/Native C-interop tool runner */
|
/** Kotlin/Native C-interop tool runner */
|
||||||
internal class KonanCliInteropRunner(
|
internal class KonanCliInteropRunner(
|
||||||
private val project: Project,
|
private val project: Project,
|
||||||
|
isolatedClassLoadersService: KonanCliRunnerIsolatedClassLoadersService,
|
||||||
additionalJvmArgs: List<String> = emptyList(),
|
additionalJvmArgs: List<String> = emptyList(),
|
||||||
konanHome: String = project.konanHome
|
konanHome: String = project.konanHome
|
||||||
) : KonanCliRunner("cinterop", project, additionalJvmArgs, konanHome) {
|
) : KonanCliRunner("cinterop", project, isolatedClassLoadersService, additionalJvmArgs, konanHome) {
|
||||||
private val projectDir = project.projectDir.toString()
|
private val projectDir = project.projectDir.toString()
|
||||||
|
|
||||||
override val mustRunViaExec: Boolean
|
override val mustRunViaExec: Boolean
|
||||||
@@ -173,9 +172,3 @@ internal class KonanCliInteropRunner(
|
|||||||
null
|
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.konan.target.PlatformManager
|
||||||
import org.jetbrains.kotlin.library.uniqueName
|
import org.jetbrains.kotlin.library.uniqueName
|
||||||
import org.jetbrains.kotlin.*
|
import org.jetbrains.kotlin.*
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.konan.KonanCliRunnerIsolatedClassLoadersService
|
||||||
import org.jetbrains.kotlin.util.Logger
|
import org.jetbrains.kotlin.util.Logger
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -82,6 +83,8 @@ abstract class KonanCacheTask : DefaultTask() {
|
|||||||
@get:Input
|
@get:Input
|
||||||
var cachedLibraries: Map<File, File> = emptyMap()
|
var cachedLibraries: Map<File, File> = emptyMap()
|
||||||
|
|
||||||
|
private val isolatedClassLoadersService = KonanCliRunnerIsolatedClassLoadersService.attachingToTask(this)
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun compile() {
|
fun compile() {
|
||||||
// This code uses bootstrap version of util-klib and fails due to the older default ABI than library being used
|
// 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 += "-Xmake-per-file-cache"
|
||||||
args += additionalCacheFlags
|
args += additionalCacheFlags
|
||||||
args += cachedLibraries.map { "-Xcached-library=${it.key},${it.value}" }
|
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 {
|
abstract class KonanCompileTask @Inject constructor(private val layout: ProjectLayout): KonanBuildingTask(), KonanCompileSpec {
|
||||||
|
|
||||||
@get:Internal
|
@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
|
abstract val produce: CompilerOutputKind
|
||||||
@Internal get
|
@Internal get
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ import javax.inject.Inject
|
|||||||
|
|
||||||
abstract class KonanInteropTask @Inject constructor(private val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
|
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
|
@get:Internal
|
||||||
override val toolRunner: KonanToolRunner = interopRunner
|
override val toolRunner: KonanToolRunner = interopRunner
|
||||||
|
|||||||
@@ -63,9 +63,6 @@ ext {
|
|||||||
|
|
||||||
cacheableTargetNames = platformManager.hostPlatform.cacheableTargets
|
cacheableTargetNames = platformManager.hostPlatform.cacheableTargets
|
||||||
cacheableTargets = cacheableTargetNames.collect { platformManager.targetByName(it) }
|
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 {
|
allprojects {
|
||||||
|
|||||||
Reference in New Issue
Block a user