* dcrt0.cc (do_exit): Don't set ES_SET_MUTO here. Call get_exit_lock()

instead.
(get_exit_lock): New function.  Grabs the lock and sets initial exit_state.
* exceptions.cc (try_to_debug): Use low_priority_sleep.
(sigpacket::process): Avoid handler if this is an exec stub.
(signal_exit): Use get_exit_lock rather than manipulating the exit_lock
critical section directly.
* pinfo.cc (pinfo::exit): Ditto.
* winsup.h (get_exit_lock): Declare.
(exit_lock): Delete declaration.
This commit is contained in:
Christopher Faylor 2005-09-30 23:52:13 +00:00
parent fd45a7909b
commit f5cfdc0fa4
5 changed files with 38 additions and 12 deletions

View File

@ -1,3 +1,17 @@
2005-09-30 Christopher Faylor <cgf@timesys.com>
* dcrt0.cc (do_exit): Don't set ES_SET_MUTO here. Call get_exit_lock()
instead.
(get_exit_lock): New function. Grabs the lock and sets initial
exit_state.
* exceptions.cc (try_to_debug): Use low_priority_sleep.
(sigpacket::process): Avoid handler if this is an exec stub.
(signal_exit): Use get_exit_lock rather than manipulating the exit_lock
critical section directly.
* pinfo.cc (pinfo::exit): Ditto.
* winsup.h (get_exit_lock): Declare.
(exit_lock): Delete declaration.
2005-09-30 Corinna Vinschen <corinna@vinschen.de> 2005-09-30 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc: Change calls to pc.set_attributes into * fhandler_disk_file.cc: Change calls to pc.set_attributes into

View File

@ -1021,13 +1021,7 @@ do_exit (int status)
} }
#endif #endif
EnterCriticalSection (&exit_lock); get_exit_lock ();
if (exit_state < ES_SET_MUTO)
{
exit_state = ES_SET_MUTO;
muto::set_exiting_thread ();
}
if (exit_state < ES_GLOBAL_DTORS) if (exit_state < ES_GLOBAL_DTORS)
{ {
@ -1144,6 +1138,18 @@ _exit (int n)
do_exit (((DWORD) n & 0xff) << 8); do_exit (((DWORD) n & 0xff) << 8);
} }
void
get_exit_lock ()
{
extern CRITICAL_SECTION exit_lock;
EnterCriticalSection (&exit_lock);
if (exit_state < ES_SET_MUTO)
{
exit_state = ES_SET_MUTO;
muto::set_exiting_thread ();
}
}
extern "C" void extern "C" void
__api_fatal (const char *fmt, ...) __api_fatal (const char *fmt, ...)
{ {

View File

@ -388,7 +388,7 @@ try_to_debug (bool waitloop)
return dbg; return dbg;
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE); SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
while (!being_debugged ()) while (!being_debugged ())
Sleep (0); low_priority_sleep (0);
Sleep (2000); Sleep (2000);
} }
@ -1041,7 +1041,13 @@ sigpacket::process ()
myself->rusage_self.ru_nsignals++; myself->rusage_self.ru_nsignals++;
bool masked; bool masked;
void *handler = (void *) thissig.sa_handler; void *handler;
if (!hExeced || (void *) thissig.sa_handler == (void *) SIG_IGN)
handler = (void *) thissig.sa_handler;
else if (tls)
return 1;
else
handler = NULL;
if (si.si_signo == SIGKILL) if (si.si_signo == SIGKILL)
goto exit_sig; goto exit_sig;
@ -1175,7 +1181,7 @@ signal_exit (int rc)
TerminateProcess (hExeced, sigExeced = rc); TerminateProcess (hExeced, sigExeced = rc);
} }
EnterCriticalSection (&exit_lock); get_exit_lock ();
if (hExeced || exit_state) if (hExeced || exit_state)
myself.exit (rc); myself.exit (rc);

View File

@ -140,7 +140,7 @@ pinfo::zap_cwd ()
void void
pinfo::exit (DWORD n) pinfo::exit (DWORD n)
{ {
EnterCriticalSection (&exit_lock); get_exit_lock ();
cygthread::terminate (); cygthread::terminate ();
if (n != EXITCODE_NOSET) if (n != EXITCODE_NOSET)
self->exitcode = EXITCODE_SET | n;/* We're really exiting. Record the UNIX exit code. */ self->exitcode = EXITCODE_SET | n;/* We're really exiting. Record the UNIX exit code. */

View File

@ -203,6 +203,7 @@ enum exit_states
extern exit_states exit_state; extern exit_states exit_state;
void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn)); void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn));
void __stdcall get_exit_lock ();
/* UID/GID */ /* UID/GID */
void uinfo_init (); void uinfo_init ();
@ -347,7 +348,6 @@ extern HANDLE hMainProc;
extern HANDLE hProcToken; extern HANDLE hProcToken;
extern HANDLE hProcImpToken; extern HANDLE hProcImpToken;
extern HANDLE hExeced; extern HANDLE hExeced;
extern CRITICAL_SECTION exit_lock;
extern bool cygwin_testing; extern bool cygwin_testing;