From 5e477e9a9b0bf9597f8f9a829edfe554ee97b140 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Fri, 23 Sep 2005 23:37:52 +0000 Subject: [PATCH] Semi-reversion of always-exit-from-sigthread change of 2005-09-15. * exceptions.cc (sigpacket::process): Eliminate return after call to reinstated noreturn function. (signal_exit): Allow function to exit when a captive process has been terminated. * pinfo.cc (pinfo::exit): Enter exit_lock here. Once again exit here under control of exit_lock. * sigproc.cc (sig_send): Don't wait for completion if process is exiting. Remove special __SIGEXIT accommodations. (wait_sig): Just exit the thread when a __SIGEXIT has been detected. Don't exit the process. --- winsup/cygwin/ChangeLog | 14 +++++++++++++ winsup/cygwin/exceptions.cc | 9 +++------ winsup/cygwin/init.cc | 1 + winsup/cygwin/pinfo.cc | 20 ++++--------------- winsup/cygwin/sigproc.cc | 39 ++++--------------------------------- 5 files changed, 26 insertions(+), 57 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a69681a0c..2f2a6fc8a 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,17 @@ +2005-09-23 Christopher Faylor + + Semi-reversion of always-exit-from-sigthread change of 2005-09-15. + * exceptions.cc (sigpacket::process): Eliminate return after call to + reinstated noreturn function. + (signal_exit): Allow function to exit when a captive process has been + terminated. + * pinfo.cc (pinfo::exit): Enter exit_lock here. Once again exit here + under control of exit_lock. + * sigproc.cc (sig_send): Don't wait for completion if process is exiting. + Remove special __SIGEXIT accommodations. + (wait_sig): Just exit the thread when a __SIGEXIT has been detected. + Don't exit the process. + 2005-09-23 Christopher Faylor * net.cc (cygwin_gethostbyname): Remove debugging cruft. diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 79cc251a3..c51dd0b1a 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -40,7 +40,7 @@ extern NO_COPY DWORD dwExeced; int NO_COPY sigExeced; static BOOL WINAPI ctrl_c_handler (DWORD); -static void signal_exit (int); +static void signal_exit (int) __attribute__ ((noreturn)); char windows_system_directory[1024]; static size_t windows_system_directory_length; @@ -1160,9 +1160,7 @@ exit_sig: si.si_signo |= 0x80; } sigproc_printf ("signal %d, about to call do_exit", si.si_signo); - signal_exit (si.si_signo); - /* May not return */ - return rc; + signal_exit (si.si_signo); /* never returns */ } CRITICAL_SECTION NO_COPY exit_lock; @@ -1177,11 +1175,10 @@ signal_exit (int rc) { sigproc_printf ("terminating captive process"); TerminateProcess (hExeced, sigExeced = rc); - return; } EnterCriticalSection (&exit_lock); - if (exit_already++) + if (hExeced || exit_state) myself.exit (rc); /* We'd like to stop the main thread from executing but when we do that it diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index cad51cc8e..b00b7fed6 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -141,6 +141,7 @@ extern "C" int WINAPI dll_entry (HANDLE h, DWORD reason, void *static_load) { BOOL is_wow64_proc = FALSE; + // _STRACE_ON; switch (reason) { diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 2a5f47c9f..e2e62185f 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -151,31 +151,19 @@ pinfo::exit (DWORD n) } sigproc_terminate (ES_FINAL); + zap_cwd (); /* FIXME: There is a potential race between an execed process and its parent here. I hated to add a mutex just for that, though. */ struct rusage r; fill_rusage (&r, hMainProc); add_rusage (&self->rusage_self, &r); - - if (n != EXITCODE_NOSET) - { - zap_cwd (); - self->alert_parent (0); /* Shave a little time by telling our - parent that we have now exited. */ - } int exitcode = self->exitcode & 0xffff; if (!self->cygstarted) exitcode >>= 8; - - _my_tls.stacklock = 0; - _my_tls.stackptr = _my_tls.stack; - sigproc_printf ("Calling ExitThread hProcess %p, n %p, exitcode %p", - hProcess, n, exitcode); - if (&_my_tls == _sig_tls) - ExitProcess (exitcode); - else - ExitThread (exitcode); + release (); + sigproc_printf ("Calling ExitProcess n %p, exitcode %p", n, exitcode); + ExitProcess (exitcode); } # undef self diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 6bcb6bce9..69c9bce20 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -553,7 +553,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) } if (wait_sig_inited) wait_for_sigthread (); - wait_for_completion = p != myself_nowait && _my_tls.isinitialized (); + wait_for_completion = p != myself_nowait && _my_tls.isinitialized () && !exit_state; p = myself; } @@ -621,15 +621,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) pack.si.si_uid = myself->uid; pack.pid = myself->pid; pack.tls = (_cygtls *) tls; - if (si.si_signo == __SIGEXIT) - { - if (&_my_tls == _main_tls) - pack.thread_handle = hMainThread; - else - DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, &pack.thread_handle, 0, - FALSE, DUPLICATE_SAME_ACCESS); - } - else if (wait_for_completion) + if (wait_for_completion) { pack.wakeup = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); sigproc_printf ("wakeup %p", pack.wakeup); @@ -1122,29 +1114,6 @@ wait_sig (VOID *self) break; } - my_sendsig = NULL; - HANDLE& h = pack.thread_handle; - if (!h) - api_fatal ("no thread handle set on exit"); - DWORD res = WaitForSingleObject (h, INFINITE); - - DWORD exitcode = 1; - - myself.release (); - if (res == WAIT_OBJECT_0) - { - GetExitCodeThread (h, &exitcode); -#ifdef DEBUGGING - hMainThread = INVALID_HANDLE_VALUE; -#endif - } else { -#ifdef DEBUGGING - console_printf ("wait for main thread %p returned %d", h, res); -#else - debug_printf ("wait for main thread %p returned %d", h, res); -#endif - } - - sigproc_printf ("calling ExitProcess, exitcode %p", exitcode); - ExitProcess (exitcode); + sigproc_printf ("signal thread exiting"); + ExitThread (0); }