Support parallel execution for Interop Gen task via Worker's API (#2035)
This commit is contained in:
committed by
Ilya Matveev
parent
7d1713a4c9
commit
1b6c36c860
@@ -71,6 +71,7 @@ project.rootProject.ext.platformManager.enabled.each { target ->
|
|||||||
def libTask = konanArtifacts."$libName"."$targetName"
|
def libTask = konanArtifacts."$libName"."$targetName"
|
||||||
libTask.dependsOn df.config.depends.collect{ defFileToLibName(targetName, it) }
|
libTask.dependsOn df.config.depends.collect{ defFileToLibName(targetName, it) }
|
||||||
libTask.dependsOn ":${targetName}CrossDist"
|
libTask.dependsOn ":${targetName}CrossDist"
|
||||||
|
libTask.enableParallel = true
|
||||||
|
|
||||||
task "$libName"(type: KlibInstall) {
|
task "$libName"(type: KlibInstall) {
|
||||||
klib = libTask.artifact
|
klib = libTask.artifact
|
||||||
|
|||||||
+1
-1
@@ -47,7 +47,7 @@ abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildin
|
|||||||
protected abstract fun buildArgs(): List<String>
|
protected abstract fun buildArgs(): List<String>
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun run() {
|
open fun run() {
|
||||||
destinationDir.mkdirs()
|
destinationDir.mkdirs()
|
||||||
if (dumpParameters) { dumpProperties(this) }
|
if (dumpParameters) { dumpProperties(this) }
|
||||||
toolRunner.run(buildArgs())
|
toolRunner.run(buildArgs())
|
||||||
|
|||||||
+38
-1
@@ -18,9 +18,13 @@ package org.jetbrains.kotlin.gradle.plugin.tasks
|
|||||||
|
|
||||||
import groovy.lang.Closure
|
import groovy.lang.Closure
|
||||||
import org.gradle.api.Action
|
import org.gradle.api.Action
|
||||||
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
|
import org.gradle.api.invocation.Gradle
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
import org.gradle.util.ConfigureUtil
|
import org.gradle.util.ConfigureUtil
|
||||||
|
import org.gradle.workers.IsolationMode
|
||||||
|
import org.gradle.workers.WorkerExecutor
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KonanInteropSpec.IncludeDirectoriesSpec
|
import org.jetbrains.kotlin.gradle.plugin.KonanInteropSpec.IncludeDirectoriesSpec
|
||||||
import org.jetbrains.kotlin.gradle.plugin.model.KonanModelArtifact
|
import org.jetbrains.kotlin.gradle.plugin.model.KonanModelArtifact
|
||||||
@@ -30,11 +34,14 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
|||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
import org.jetbrains.kotlin.konan.target.Distribution
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A task executing cinterop tool with the given args and compiling the stubs produced by this tool.
|
* A task executing cinterop tool with the given args and compiling the stubs produced by this tool.
|
||||||
*/
|
*/
|
||||||
open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec {
|
|
||||||
|
open class KonanInteropTask @Inject constructor(val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
|
||||||
|
|
||||||
@Internal override val toolRunner: KonanToolRunner = KonanInteropRunner(project, project.konanExtension.jvmArgs)
|
@Internal override val toolRunner: KonanToolRunner = KonanInteropRunner(project, project.konanExtension.jvmArgs)
|
||||||
|
|
||||||
@@ -53,6 +60,8 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec {
|
|||||||
|
|
||||||
// Interop stub generator parameters -------------------------------------
|
// Interop stub generator parameters -------------------------------------
|
||||||
|
|
||||||
|
@Internal var enableParallel: Boolean = false
|
||||||
|
|
||||||
@InputFile lateinit var defFile: File
|
@InputFile lateinit var defFile: File
|
||||||
|
|
||||||
@Optional @Input var packageName: String? = null
|
@Optional @Input var packageName: String? = null
|
||||||
@@ -179,5 +188,33 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
internal class RunTool @Inject constructor(
|
||||||
|
val taskName: String,
|
||||||
|
val args: List<String>
|
||||||
|
) : Runnable {
|
||||||
|
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
val toolRunner = interchangeBox.remove(taskName) ?: error(":(")
|
||||||
|
toolRunner.run(args)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
destinationDir.mkdirs()
|
||||||
|
if (dumpParameters) { dumpProperties(this) }
|
||||||
|
val args = buildArgs()
|
||||||
|
if (enableParallel) {
|
||||||
|
interchangeBox[this.path] = toolRunner
|
||||||
|
workerExecutor.submit(RunTool::class.java) {
|
||||||
|
it.isolationMode = IsolationMode.NONE
|
||||||
|
it.params(this.path, args)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
toolRunner.run(args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val interchangeBox = ConcurrentHashMap<String, KonanToolRunner>()
|
||||||
Reference in New Issue
Block a user