OSDN Git Service

* sigproc.cc (close_my_readsig): New function.
authorcgf <cgf>
Mon, 5 Dec 2011 15:59:06 +0000 (15:59 +0000)
committercgf <cgf>
Mon, 5 Dec 2011 15:59:06 +0000 (15:59 +0000)
(_cygtls::signal_exit): Close my_readsig via close_my_readsig(), avoiding
communication with the signal pipe.
(wait_sig): Close my_readsig via close_my_readsig().

winsup/cygwin/ChangeLog
winsup/cygwin/sigproc.cc

index d56d2a4..7f33e9a 100644 (file)
@@ -1,3 +1,10 @@
+2011-12-05  Christopher Faylor  <me.cygwin2011@cgf.cx>
+
+       * sigproc.cc (close_my_readsig): New function.
+       (_cygtls::signal_exit): Close my_readsig via close_my_readsig(),
+       avoiding communication with the signal pipe.
+       (wait_sig): Close my_readsig via close_my_readsig().
+
 2011-12-05  Corinna Vinschen  <vinschen@redhat.com>
 
        * mmap.cc (mlock): Replace LOCK_VM_IN_WSL with correct MAP_PROCESS.
index 1770b4f..0031f73 100644 (file)
@@ -360,6 +360,14 @@ _cygtls::remove_wq (DWORD wait)
     }
 }
 
+inline void
+close_my_readsig ()
+{
+  HANDLE h;
+  if ((h = InterlockedExchangePointer (&my_readsig, NULL)))
+    ForceCloseHandle1 (h, my_readsig);
+}
+
 /* Cover function to `do_exit' to handle exiting even in presence of more
    exceptions.  We used to call exit, but a SIGSEGV shouldn't cause atexit
    routines to run.  */
@@ -368,17 +376,8 @@ _cygtls::signal_exit (int rc)
 {
   extern void stackdump (DWORD, int, bool);
 
-  HANDLE myss = my_sendsig;
   my_sendsig = NULL;            /* Make no_signals_allowed return true */
-  if (&_my_tls == _sig_tls)
-    ForceCloseHandle (my_readsig); /* Stop any currently executing sig_sends */
-  else
-    {
-      sigpacket sp = {};
-      sp.si.si_signo = __SIGEXIT;
-      DWORD len;
-      WriteFile (myss, &sp, sizeof (sp), &len, NULL);
-    }
+  close_my_readsig ();
 
   SetEvent (signal_arrived);    /* Avoid potential deadlock with proc_lock */
 
@@ -1422,7 +1421,7 @@ wait_sig (VOID *)
        break;
     }
 
-  ForceCloseHandle (my_readsig);
+  close_my_readsig ();
   sigproc_printf ("signal thread exiting");
   ExitThread (0);
 }