Review request 6985422: flush the output streams before OnError commands
David Holmes
David.Holmes at oracle.com
Sun Sep 19 23:48:50 PDT 2010
Chuck Rasbold said the following on 09/18/10 03:07:
> On Thu, Sep 16, 2010 at 4:57 PM, David Holmes <David.Holmes at oracle.com
> <mailto:David.Holmes at oracle.com>> wrote:
> Why was the ostream_abort() removed from the os::shutdown() path?
>
> In the existing code we have:
>
> VMError::report_and_die()
> -> os::abort()
> -> os::shutdown()
> -> ostream_abort()
>
>
> It seems backward to me the the os-specific abort() calls ostream_abort().
>
> Ostream_init() and ostream_init_log() are called from create_vm(), I
> think it would be preferable to clean-up the ostreams at a similar level.
I don't see how you can given that you may need the streams right up
until you actually abort the process, and that is done down in the
depths of the os::abort/shutdown code at the end of the error path.
Normal VM termination is a different matter and ostream_exit() is used
for that purpose.
> and you've moved ostream_abort() into report_and_die(), but there
> are other exit paths that also call os::shutdown() and will no
> longer call ostream_abort():
>
> vm_shutdown_during_initialization()
> -> vm_shutdown()
> -> os::shutdown()
>
>
> Agreed that I missed vm_shutdown() in java.cpp. I'd be happy to add a
> call to ostream_abort() there.
I think this is the wrong place to "abort" the output streams. It only
works, in my view, because the tty and gc streams don't actually get
"aborted" just flushed. Otherwise I suspect that there might be use of
those streams after the current call to ostream_abort().
> Are there other call sites to os:shutdown() that I've missed? If so,
> perhaps it is safer to leave the originals calls in os::abort() as I've
> underestimated the complexity of the shutdown code.
I don't think you missed anything else, but I think this is the wrong
way to fix it.
> Also with this move you need to fix this comment in ostream.cpp:
>
> // ostream_abort() is called by os::abort() when VM is about to die.
> void ostream_abort() {
>
> True.
>
>
> Why not just add explicit flush() calls where needed?
>
>
> Flushing is pretty much what ostream_abort() does. The compilation log
> flushing code is short but non-trivial. I think it is best not
> duplicate the it.
I would rather see distinct flushing and "aborting" methods for the
streams. ostream_abort() happens to also need to perform flushing, but
flushing need not lead to aborting.
David
> -- Chuck
>
>
> David Holmes
>
>
> Contributed-by: rasbold at google.com <mailto:rasbold at google.com>
>
>
More information about the hotspot-dev
mailing list