From c1dedea603d4e9b281d8308070da53308f617f12 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sat, 10 Dec 2011 01:33:56 +0000 Subject: [PATCH] * exceptions.cc (ctrl_c_handler): YA in a series or reversions. Put back _my_tls.remove along with a comment. (sigpacket::process): Remove code which now causes a gdb deadlock. * sigproc.cc (_cygtls::signal_exit): Signal debugger with signal number earlier. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/exceptions.cc | 16 +++++++--------- winsup/cygwin/sigproc.cc | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e04286ff5..76aa49409 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2011-12-09 Christopher Faylor + + * exceptions.cc (ctrl_c_handler): YA in a series or reversions. Put + back _my_tls.remove along with a comment. + (sigpacket::process): Remove code which now causes a gdb deadlock. + * sigproc.cc (_cygtls::signal_exit): Signal debugger with signal number + earlier. + 2011-12-09 Christopher Faylor * dllfixdbg: Work around annoying gdb warning about missing diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index b16e8162a..351532a5e 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -936,6 +936,13 @@ ctrl_c_handler (DWORD type) ExitProcess (STATUS_CONTROL_C_EXIT); } + /* Remove early or we could overthrow the threadlist in cygheap. + Deleting this line causes ash to SEGV if CTRL-C is hit repeatedly. + I am not exactly sure why that is. Maybe it's just because this + adds some early serialization to ctrl_c_handler which prevents + multiple simultaneous calls? */ + _my_tls.remove (INFINITE); + #if 0 if (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT) proc_subproc (PROC_KILLFORKED, 0); @@ -1235,15 +1242,6 @@ sigpacket::process () if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU) sig_clear (SIGCONT); -#ifdef CGF - if (being_debugged ()) - { - char sigmsg[sizeof (_CYGWIN_SIGNAL_STRING " 0xffffffff")]; - __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %p", si.si_signo); - OutputDebugString (sigmsg); - } -#endif - if (handler == (void *) SIG_DFL) { if (insigwait_mask) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index d9d4bcfed..a8c45f707 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -396,6 +396,7 @@ _cygtls::signal_exit (int rc) close my_readsig. */ WriteFile (myss, &sp, sizeof (sp), &len, NULL); } + signal_debugger (rc & 0x7f); if (rc == SIGQUIT || rc == SIGABRT) { @@ -413,7 +414,6 @@ _cygtls::signal_exit (int rc) TerminateProcess (ch_spawn, sigExeced = rc); } - signal_debugger (rc & 0x7f); if ((rc & 0x80) && !try_to_debug ()) stackdump (thread_context.ebp, 1, 1); -- 2.43.5