* exceptions.cc (events_init): Initialize critical section to control exiting

via signal.
(signal_exit): Enter critical section early to avoid exit races with main
thread.
* dcrt0.cc (do_exit): Use exit_lock critical section to avoid races.
This commit is contained in:
Christopher Faylor 2002-12-25 20:33:21 +00:00
parent a8eb76e3e1
commit 088f471c75
3 changed files with 14 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2002-12-25 Christopher Faylor <cgf@redhat.com>
* exceptions.cc (events_init): Initialize critical section to control
exiting via signal.
(signal_exit): Enter critical section early to avoid exit races with
main thread.
* dcrt0.cc (do_exit): Use exit_lock critical section to avoid races.
2002-12-25 Christopher Faylor <cgf@redhat.com>
* cygthread.cc (cygthread::detach): Set errno with set_sig_errno so

View File

@ -967,10 +967,12 @@ enum exit_states
};
exit_states NO_COPY exit_state;
extern CRITICAL_SECTION exit_lock;
extern "C" void __stdcall
do_exit (int status)
{
EnterCriticalSection (&exit_lock);
UINT n = (UINT) status;
syscall_printf ("do_exit (%d)", n);

View File

@ -1088,12 +1088,15 @@ sig_handle (int sig, bool thisproc)
/* Never returns */
}
CRITICAL_SECTION NO_COPY exit_lock;
/* Cover function to `do_exit' to handle exiting even in presence of more
exceptions. We used to call exit, but a SIGSEGV shouldn't cause atexit
routines to run. */
static void
signal_exit (int rc)
{
EnterCriticalSection (&exit_lock);
rc = EXIT_SIGNAL | (rc << 8);
if (exit_already++)
myself->exit (rc);
@ -1149,6 +1152,7 @@ events_init (void)
debug_printf ("windows_system_directory '%s', windows_system_directory_length %d",
windows_system_directory, windows_system_directory_length);
debug_printf ("cygwin_hmodule %p", cygwin_hmodule);
InitializeCriticalSection (&exit_lock);
}
void