On Windows, when trying to use the new javac-server mode (or sjavac), each java compilation process that spawns a javac server ends up waiting for that server to shut down before shutting down itself. This behavior is caused by the new LogFailure feature, where each javac invocation is wrapped with our logger.sh script, which in turn uses "tee" to record output to special log files.

It has been a long standing known issue that sjavac on windows has not been compatible with having the automatic build log feature active, for the same reason. This old problem was worked around by simply disabling logging to file when using sjavac on windows. For the LogFailures feature, I would definitely prefer not having to disable it.

It seems that spawning a completely detached background process on Windows can be a bit tricky, especially from java. You need to launch a process with certain flags and settings to the native CreateProcess() call and java.lang.ProcessBuilder is not providing an interface where those flags can be set.

The solution then is to put another native program between the server java and the client java process. We already have one such program, fixpath, and we might as well add a new feature there. I have experimented and found a solution that works by adding a new optional parameter to fixpath "--detach". It launches the child process in detached mode as well as not inheriting handles. It also causes fixpath to exit right after spawning the process instead waiting for an exit code.

Bug: https://bugs.openjdk.java.net/browse/JDK-8143296
Webrev: http://cr.openjdk.java.net/~erikj/8143296/webrev.01/

/Erik

Reply via email to