Re: RFR: JDK-8143296: javac-server/sjavac not compatible with LogFailures on Windows

2015-11-24 Thread Magnus Ihse Bursie

On 2015-11-19 12:10, Erik Joelsson wrote:
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/


The sjavac code is a bit tricky to follow, but your changes look good to me.

/Magnus


RFR: JDK-8143296: javac-server/sjavac not compatible with LogFailures on Windows

2015-11-19 Thread Erik Joelsson
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