Skip to content

Commit

Permalink
Fixing problem of hanging wait for jps process in idea by using a nat…
Browse files Browse the repository at this point in the history
…ive-platform lib for platform-specific daemon execution

Adding native-platform uberjar contents to kotlin jps plugin jar
  • Loading branch information
ligee committed Oct 7, 2015
1 parent 6848628 commit 50f482e
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 13 deletions.
1 change: 1 addition & 0 deletions .idea/artifacts/KotlinJpsPlugin.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/libraries/native_platform_uberjar.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions build.xml
Expand Up @@ -592,11 +592,13 @@
<pathelement path="${bootstrap.runtime}"/>
<pathelement path="${bootstrap.reflect}"/>
<pathelement path="${kotlin-home}/lib/kotlin-compiler.jar"/>
<pathelement path="${dependencies.dir}/native-platform-uberjar.jar"/>
</classpath>
</kotlinc>

<jar destfile="${kotlin-home}/lib/kotlinr.jar">
<fileset dir="${output}/classes/kotlinr"/>
<zipfileset src="${dependencies.dir}/native-platform-uberjar.jar" includes="**" />
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
</jar>
</target>
Expand Down
1 change: 1 addition & 0 deletions compiler/rmi/kotlinr/kotlinr.iml
Expand Up @@ -11,5 +11,6 @@
<orderEntry type="module" module-name="rmi-interface" />
<orderEntry type="module" module-name="frontend.java" />
<orderEntry type="module" module-name="util" />
<orderEntry type="library" name="native-platform-uberjar" level="project" />
</component>
</module>
Expand Up @@ -16,6 +16,7 @@

package org.jetbrains.kotlin.rmi.kotlinr

import net.rubygrapefruit.platform.ProcessLauncher
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
import org.jetbrains.kotlin.rmi.*
Expand Down Expand Up @@ -317,31 +318,41 @@ public object KotlinCompilerClient {
}
// TODO add os detection to specify option more precisely
val platformSpecificOptions = listOf("-Djava.awt.headless=true") // hide daemon in OS X
val args = listOf(javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator)) +
val args = listOf(
javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator)) +
platformSpecificOptions +
daemonJVMOptions.mappers.flatMap { it.toArgs("-") } +
COMPILER_DAEMON_CLASS_FQN +
daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } +
compilerId.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) }
reportingTargets.report(DaemonReportCategory.DEBUG, "starting the daemon as: " + args.joinToString(" "))
val processBuilder = ProcessBuilder(args).redirectErrorStream(true)
val processBuilder = ProcessBuilder(args)
processBuilder.redirectErrorStream(true)
// assuming daemon process is deaf and (mostly) silent, so do not handle streams
val daemon = processBuilder.start()
val daemonLauncher = net.rubygrapefruit.platform.Native.get(ProcessLauncher::class.java)
val daemon = daemonLauncher.start(processBuilder)

var isEchoRead = Semaphore(1)
isEchoRead.acquire()

val stdoutThread =
thread {
daemon.inputStream
.reader()
.forEachLine {
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
isEchoRead.release()
return@forEachLine
try {
daemon.inputStream
.reader()
.forEachLine {
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
isEchoRead.release()
return@forEachLine
}
reportingTargets.report(DaemonReportCategory.DEBUG, it, "daemon")
}
reportingTargets.report(DaemonReportCategory.DEBUG, it, "daemon")
}
}
finally {
daemon.inputStream.close()
daemon.outputStream.close()
daemon.errorStream.close()
}
}
try {
// trying to wait for process
Expand Down
50 changes: 48 additions & 2 deletions update_dependencies.xml
Expand Up @@ -45,6 +45,10 @@

<property name="dependencies.info.file" value="dependencies/dependencies.properties"/>

<property name="gradle.libs.repo" value="http://repo.gradle.org/gradle/libs-releases-local"/>

<property name="native-platform-lib-version" value="0.10"/>

<property file="${dependencies.info.file}" prefix="dependencies.info.prev"/>

<target name="update" depends="fetch-third-party,fetch-annotations" description="Update dependencies">
Expand Down Expand Up @@ -118,8 +122,50 @@
<move file="dependencies/apache-ant-@{version}" tofile="dependencies/@{folderName}"/>
</sequential>
</macrodef>

<target name="fetch-third-party" depends="override-version">

<target name="make-native-platform-uberjar" depends="override-version">
<property name="dependencies" value="dependencies"/>
<property name="download" value="${dependencies}/download"/>
<property name="server" value="${gradle.libs.repo}"/>
<property name="version" value="${native-platform-lib-version}"/>
<property name="common.name" value="native-platform"/>
<property name="common.prefix" value="${server}/net/rubygrapefruit/${common.name}"/>

<macrodef name="get-lib">
<attribute name="suffix"/>
<sequential>
<get src="${common.prefix}@{suffix}/${version}/${common.name}@{suffix}-${version}.jar" dest="${download}/${common.name}@{suffix}.jar" usetimestamp="true"/>
</sequential>
</macrodef>

<mkdir dir="${dependencies}"/>
<mkdir dir="${download}"/>

<get-lib suffix=""/>
<get-lib suffix="-windows-amd64"/>
<get-lib suffix="-windows-i386"/>
<get-lib suffix="-osx-amd64"/>
<get-lib suffix="-osx-i386"/>
<get-lib suffix="-linux-amd64"/>
<get-lib suffix="-linux-i386"/>
<get-lib suffix="-freebsd-amd64"/>
<get-lib suffix="-freebsd-i386"/>

<jar destfile="${dependencies}/${common.name}-uberjar.jar">
<zipfileset src="${download}/${common.name}.jar" includes="**" />
<zipfileset src="${download}/${common.name}-windows-amd64.jar" includes="**" />
<zipfileset src="${download}/${common.name}-windows-i386.jar" includes="**" />
<zipfileset src="${download}/${common.name}-osx-amd64.jar" includes="**" />
<zipfileset src="${download}/${common.name}-osx-i386.jar" includes="**" />
<zipfileset src="${download}/${common.name}-linux-amd64.jar" includes="**" />
<zipfileset src="${download}/${common.name}-linux-i386.jar" includes="**" />
<zipfileset src="${download}/${common.name}-freebsd-amd64.jar" includes="**" />
<zipfileset src="${download}/${common.name}-freebsd-i386.jar" includes="**" />
</jar>

</target>

<target name="fetch-third-party" depends="override-version,make-native-platform-uberjar">
<mkdir dir="dependencies"/>
<mkdir dir="dependencies/download"/>

Expand Down

0 comments on commit 50f482e

Please sign in to comment.