* 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:
@ -388,7 +388,7 @@ try_to_debug (bool waitloop)
|
||||
return dbg;
|
||||
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
|
||||
while (!being_debugged ())
|
||||
Sleep (0);
|
||||
low_priority_sleep (0);
|
||||
Sleep (2000);
|
||||
}
|
||||
|
||||
@ -1041,7 +1041,13 @@ sigpacket::process ()
|
||||
myself->rusage_self.ru_nsignals++;
|
||||
|
||||
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)
|
||||
goto exit_sig;
|
||||
@ -1175,7 +1181,7 @@ signal_exit (int rc)
|
||||
TerminateProcess (hExeced, sigExeced = rc);
|
||||
}
|
||||
|
||||
EnterCriticalSection (&exit_lock);
|
||||
get_exit_lock ();
|
||||
if (hExeced || exit_state)
|
||||
myself.exit (rc);
|
||||
|
||||
|
Reference in New Issue
Block a user