* 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:
parent
a8eb76e3e1
commit
088f471c75
@ -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>
|
2002-12-25 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* cygthread.cc (cygthread::detach): Set errno with set_sig_errno so
|
* cygthread.cc (cygthread::detach): Set errno with set_sig_errno so
|
||||||
|
@ -967,10 +967,12 @@ enum exit_states
|
|||||||
};
|
};
|
||||||
|
|
||||||
exit_states NO_COPY exit_state;
|
exit_states NO_COPY exit_state;
|
||||||
|
extern CRITICAL_SECTION exit_lock;
|
||||||
|
|
||||||
extern "C" void __stdcall
|
extern "C" void __stdcall
|
||||||
do_exit (int status)
|
do_exit (int status)
|
||||||
{
|
{
|
||||||
|
EnterCriticalSection (&exit_lock);
|
||||||
UINT n = (UINT) status;
|
UINT n = (UINT) status;
|
||||||
|
|
||||||
syscall_printf ("do_exit (%d)", n);
|
syscall_printf ("do_exit (%d)", n);
|
||||||
|
@ -1088,12 +1088,15 @@ sig_handle (int sig, bool thisproc)
|
|||||||
/* Never returns */
|
/* Never returns */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CRITICAL_SECTION NO_COPY exit_lock;
|
||||||
|
|
||||||
/* Cover function to `do_exit' to handle exiting even in presence of more
|
/* 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
|
exceptions. We used to call exit, but a SIGSEGV shouldn't cause atexit
|
||||||
routines to run. */
|
routines to run. */
|
||||||
static void
|
static void
|
||||||
signal_exit (int rc)
|
signal_exit (int rc)
|
||||||
{
|
{
|
||||||
|
EnterCriticalSection (&exit_lock);
|
||||||
rc = EXIT_SIGNAL | (rc << 8);
|
rc = EXIT_SIGNAL | (rc << 8);
|
||||||
if (exit_already++)
|
if (exit_already++)
|
||||||
myself->exit (rc);
|
myself->exit (rc);
|
||||||
@ -1149,6 +1152,7 @@ events_init (void)
|
|||||||
debug_printf ("windows_system_directory '%s', windows_system_directory_length %d",
|
debug_printf ("windows_system_directory '%s', windows_system_directory_length %d",
|
||||||
windows_system_directory, windows_system_directory_length);
|
windows_system_directory, windows_system_directory_length);
|
||||||
debug_printf ("cygwin_hmodule %p", cygwin_hmodule);
|
debug_printf ("cygwin_hmodule %p", cygwin_hmodule);
|
||||||
|
InitializeCriticalSection (&exit_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user