RFR: JDK-8143296: javac-server/sjavac not compatible with LogFailures on Windows
Erik Joelsson
erik.joelsson at oracle.com
Thu Nov 19 11:10:02 UTC 2015
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
More information about the build-dev
mailing list