* 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:
parent
fd45a7909b
commit
f5cfdc0fa4
|
@ -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
|
||||||
|
|
|
@ -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, ...)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue