diff options
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 0f61409ab..efd49ce6f 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -36,10 +36,11 @@ static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *); extern void sigdelayed (); }; -extern DWORD dwExeced; +extern NO_COPY DWORD dwExeced; +int NO_COPY sigExeced; static BOOL WINAPI ctrl_c_handler (DWORD); -static void signal_exit (int) __attribute__ ((noreturn)); +static void signal_exit (int); char windows_system_directory[1024]; static size_t windows_system_directory_length; @@ -1160,7 +1161,7 @@ exit_sig: } sigproc_printf ("signal %d, about to call do_exit", si.si_signo); signal_exit (si.si_signo); - /* Never returns */ + /* May not return */ } CRITICAL_SECTION NO_COPY exit_lock; @@ -1171,6 +1172,13 @@ CRITICAL_SECTION NO_COPY exit_lock; static void signal_exit (int rc) { + if (hExeced) + { + sigproc_printf ("terminating captive process"); + TerminateProcess (hExeced, sigExeced = rc); + return; + } + EnterCriticalSection (&exit_lock); if (exit_already++) myself.exit (rc); @@ -1184,12 +1192,6 @@ signal_exit (int rc) user_data->resourcelocks->Delete (); user_data->resourcelocks->Init (); - if (hExeced) - { - sigproc_printf ("terminating captive process"); - TerminateProcess (hExeced, rc); - } - sigproc_printf ("about to call do_exit (%x)", rc); SetEvent (signal_arrived); do_exit (rc); |