rmi/rmic/CompilerProcess.java
Andrew Haley
aph@redhat.com
Wed Dec 14 18:21:00 GMT 2005
Andrew Haley writes:
> CompilerProcess has a race condition whereby it can hang during
> compilation. This happens because the child process is writing to
> stderr when it blocks; the parent process is reading from stdout.
>
> 4.0 branch only.
>
> Andrew.
>
>
> 2005-11-08 Andrew Haley <aph@redhat.com>
>
> * gnu/java/rmi/rmic/CompilerProcess.java: Use a new thread to
> handle stdout from the child process.
>
Actually, not 4.0 branch only. This bug is also present in trunk and
4.1 branch, so I'm applying the same patch there too.
Andrew.
> Index: libjava/gnu/java/rmi/rmic/CompilerProcess.java
> ===================================================================
> RCS file: /cvs/gcc/gcc/libjava/gnu/java/rmi/rmic/CompilerProcess.java,v
> retrieving revision 1.4
> diff -u -r1.4 CompilerProcess.java
> --- libjava/gnu/java/rmi/rmic/CompilerProcess.java 31 May 2004 09:17:33 -0000 1.4
> +++ libjava/gnu/java/rmi/rmic/CompilerProcess.java 8 Nov 2005 09:25:15 -0000
> @@ -89,10 +89,27 @@
> String[] args = computeArguments (name);
> Process p = Runtime.getRuntime ().exec (args);
>
> - /* Print compiler output to System.out. */
> - InputStream procin = p.getInputStream();
> - for (int ch = procin.read(); ch != -1; ch = procin.read())
> - System.out.print((char) ch);
> + /* Print compiler output to System.out. Do this asynchronously so
> + that the compiler never blocks writing to its stdout. */
> + {
> + final InputStream procin = p.getInputStream();
> + final Thread copier = new Thread()
> + {
> + public void run()
> + {
> + try
> + {
> + for (int ch = procin.read(); ch != -1; ch = procin.read())
> + System.out.print((char) ch);
> + }
> + catch (java.io.IOException _)
> + {
> + }
> + }
> + };
> +
> + copier.start();
> + }
>
> /* Collect compiler error output in a buffer.
> * If compilation fails, it will be used for an error message.
More information about the Java-patches
mailing list