Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2011-12-05 19:59:06 +0400
committerChristopher Faylor <me@cgf.cx>2011-12-05 19:59:06 +0400
commit08d944e19fbbc9f4f81b0632aa38b7f0f5d52690 (patch)
treeb4ecd3b3ae741c9d0706d5ca6a793c9af44c01bb
parent8912b2e56ff4e0082d5f7810235ce759e93d9c25 (diff)
* 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().
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/sigproc.cc21
2 files changed, 17 insertions, 11 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d56d2a49c..7f33e9ac3 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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.
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 1770b4f21..0031f73b0 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -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);
}