RFR: 8042088: Sjavac spawns external processes in a unnecessarily complex and platform dependent way
Jonathan Gibbons
jonathan.gibbons at oracle.com
Wed May 7 14:55:46 UTC 2014
javac never uses assert. We have a set of methods in
javac.util.Assert that can be used instead.
-- Jon
On 05/05/2014 04:18 AM, Fredrik Öhrström wrote:
> The output from stdout and stderr from the background must always be
> logged into a file. The default name for that file is
> portfile+".stdouterr"
> Thus you could replace stdouterrfile == null with
>
> assert(stdouterrfile != null && stdouterrfile.length() >= 1)
>
> And get rid of /dev/null etc.
>
> For example if the background jvm cannot start, for example you
> supplied a bad -Xms setting, you need to see the error message somewhere.
> It is not a good idea to force the client jvm to keep running. The
> client and the server must be independent.
>
>
>
>
> 2014-05-05 11:17 GMT+02:00 Andreas Lundblad
> <andreas.lundblad at oracle.com <mailto:andreas.lundblad at oracle.com>>:
>
> On Fri, May 02, 2014 at 03:01:17PM -0700, Jonathan Gibbons wrote:
> > The code to use NUL or /dev/null is somewhat icky. Is that actually
> > the behavior you want?
> > How about using ProcessBuilder.Redirect.INHERIT instead?
>
> I don't think we want the output of the background sjavac server
> to be interleaved with the output of the sjavac instance that
> spawned it. (Especially since the log of the background server
> would be chopped off once the foreground process terminates.)
>
> The reason I can't simply leave the whole redirect logic out is
> because the background process halts once it's output buffer is
> full. The output of the background process *has* to be consumed in
> one way or another. I could solve this by spawning a separate
> thread in the foreground process whose sole purpose is to read and
> discand output from the background process:
>
> Thread discardOutputThread = new Thread() {
> public void run() {
> InputStream is = p.getInputStream();
> try { while (is.read() != -1); }
> catch (IOException e) { }
> }
> };
> discardOutputThread.setDaemon(true);
> discardOutputThread.start();
>
> It just feels a bit awkward to leave a running dummy thread
> behind, and I can't find any documentation on what happens when
> the foreground process terminates and this thread stops. (Although
> it *did* work on when I tested it on Windows 2003 and Ubuntu.)
>
> So, while the NUL or /dev/null workaround does have a grain of
> platform dependency, I still thought it was the cleanest solution.
> I'm ready to reconsider this if others think differently.
>
> I'm somewhat surprised that there is no
> ProcessBuilder.Redirect.DISCARD. Does anybody know why such option
> is "missing"? :-(
>
> -- Andreas
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20140507/b5d63d91/attachment.html>
More information about the compiler-dev
mailing list