* DevNotes: Add entry cgf-000019.
* dcrt0.cc (do_exit): Just set exit_state to ES_EVENTS_TERMINATE and nuke call to events_terminate which just set a superfluous flag. * sigproc.cc (signal_exit_code): New variable. (setup_signal_exit): Define new function. (_cygtls::signal_exit): Remove accommodations for closing the signal pipe handle. (exit_thread): Just sleep if we're exiting. (wait_sig): If signal_exit_code is set, just handle bookkeeping signals and exit ReadFile loop if there is nothing more to process. Call signal_exit at end if signal_exit_code is non-zero. * sigproc.h (setup_signal_exit): Declare new function. * exceptions.cc (sigpacket::process): Use setup_signal_exit to control exiting due to a signal. (exception::handle): Ditto. Query exit_state rather than defunct exit_already to determine if we are exiting. * globals.cc (ES_SIGNAL_EXIT): New enum. * sync.h (lock_process::release): New function for explicitly unlocking muto. (lock_process::~lock_process): Use release method.
This commit is contained in:
@ -41,8 +41,6 @@ static BOOL WINAPI ctrl_c_handler (DWORD);
|
||||
|
||||
/* This is set to indicate that we have already exited. */
|
||||
|
||||
static NO_COPY int exit_already = 0;
|
||||
|
||||
NO_COPY static struct
|
||||
{
|
||||
unsigned int code;
|
||||
@ -481,9 +479,9 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we've already exited, don't do anything here. Returning 1
|
||||
/* If we're exiting, don't do anything here. Returning 1
|
||||
tells Windows to keep looking for an exception handler. */
|
||||
if (exit_already || e->ExceptionFlags)
|
||||
if (exit_state || e->ExceptionFlags)
|
||||
return 1;
|
||||
|
||||
siginfo_t si = {0};
|
||||
@ -673,8 +671,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
|
||||
error_code);
|
||||
}
|
||||
|
||||
/* Flag signal + core dump */
|
||||
me.signal_exit ((cygheap->rlim_core > 0UL ? 0x80 : 0) | si.si_signo);
|
||||
setup_signal_exit ((cygheap->rlim_core > 0UL ? 0x80 : 0) | si.si_signo);
|
||||
}
|
||||
|
||||
si.si_addr = (si.si_signo == SIGSEGV || si.si_signo == SIGBUS
|
||||
@ -1249,13 +1246,9 @@ done:
|
||||
return rc;
|
||||
|
||||
exit_sig:
|
||||
tls->signal_exit (si.si_signo); /* never returns */
|
||||
}
|
||||
|
||||
void
|
||||
events_terminate ()
|
||||
{
|
||||
exit_already = 1;
|
||||
sigproc_printf ("setting up for exit with signal %d", si.si_signo);
|
||||
setup_signal_exit (si.si_signo);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
|
Reference in New Issue
Block a user