Support parallel execution for Interop Gen task via Worker's API (#2035)

This commit is contained in:
Simon Ogorodnik
2018-09-11 15:45:27 +03:00
committed by Ilya Matveev
parent 7d1713a4c9
commit 1b6c36c860
3 changed files with 40 additions and 2 deletions
+1
View File
@@ -71,6 +71,7 @@ project.rootProject.ext.platformManager.enabled.each { target ->
def libTask = konanArtifacts."$libName"."$targetName"
libTask.dependsOn df.config.depends.collect{ defFileToLibName(targetName, it) }
libTask.dependsOn ":${targetName}CrossDist"
libTask.enableParallel = true
task "$libName"(type: KlibInstall) {
klib = libTask.artifact
@@ -47,7 +47,7 @@ abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildin
protected abstract fun buildArgs(): List<String>
@TaskAction
fun run() {
open fun run() {
destinationDir.mkdirs()
if (dumpParameters) { dumpProperties(this) }
toolRunner.run(buildArgs())
@@ -18,9 +18,13 @@ package org.jetbrains.kotlin.gradle.plugin.tasks
import groovy.lang.Closure
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.*
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.KonanInteropSpec.IncludeDirectoriesSpec
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.KonanTarget
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.
*/
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)
@@ -53,6 +60,8 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec {
// Interop stub generator parameters -------------------------------------
@Internal var enableParallel: Boolean = false
@InputFile lateinit var defFile: File
@Optional @Input var packageName: String? = null
@@ -179,5 +188,33 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec {
)
}
// 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>()