OSDN Git Service

* exceptions.cc (ctrl_c_handler): YA in a series or reversions. Put back
authorcgf <cgf>
Sat, 10 Dec 2011 01:33:56 +0000 (01:33 +0000)
committercgf <cgf>
Sat, 10 Dec 2011 01:33:56 +0000 (01:33 +0000)
_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
winsup/cygwin/exceptions.cc
winsup/cygwin/sigproc.cc

index e04286f..76aa494 100644 (file)
@@ -1,5 +1,13 @@
 2011-12-09  Christopher Faylor  <me.cygwin2011@cgf.cx>
 
+       * 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  <me.cygwin2011@cgf.cx>
+
        * dllfixdbg: Work around annoying gdb warning about missing
        .gnu_debuglink.
 
index b16e816..351532a 100644 (file)
@@ -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)
index d9d4bcf..a8c45f7 100644 (file)
@@ -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);