diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 911792b69..949f0a9cd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +008-06-09 Eric Blake + + * signal.cc (abort): Only flush streams after signal handler. + 2008-06-02 Christopher Faylor * cygwin.sc: Remove unrequired and erroneous definition. diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc index c39afc2b8..b3654ded0 100644 --- a/winsup/cygwin/signal.cc +++ b/winsup/cygwin/signal.cc @@ -324,16 +324,6 @@ abort (void) { _my_tls.incyg++; sig_dispatch_pending (); - /* Flush all streams as per SUSv2. - From my reading of this document, this isn't strictly correct. - The streams are supposed to be flushed prior to exit. However, - if there is I/O in any signal handler that will not necessarily - be flushed. - However this is the way FreeBSD does it, and it is much easier to - do things this way, so... */ - if (_GLOBAL_REENT->__cleanup) - _GLOBAL_REENT->__cleanup (_GLOBAL_REENT); - /* Ensure that SIGABRT can be caught regardless of blockage. */ sigset_t sig_mask; sigfillset (&sig_mask); @@ -342,6 +332,10 @@ abort (void) raise (SIGABRT); _my_tls.call_signal_handler (); /* Call any signal handler */ + + /* Flush all streams as per SUSv2. */ + if (_GLOBAL_REENT->__cleanup) + _GLOBAL_REENT->__cleanup (_GLOBAL_REENT); do_exit (SIGABRT); /* signal handler didn't exit. Goodbye. */ }