diff options
author | Christopher Faylor <me@cgf.cx> | 2011-12-05 15:59:06 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2011-12-05 15:59:06 +0000 |
commit | 08d944e19fbbc9f4f81b0632aa38b7f0f5d52690 (patch) | |
tree | b4ecd3b3ae741c9d0706d5ca6a793c9af44c01bb | |
parent | 8912b2e56ff4e0082d5f7810235ce759e93d9c25 (diff) | |
download | cygnal-08d944e19fbbc9f4f81b0632aa38b7f0f5d52690.tar.gz cygnal-08d944e19fbbc9f4f81b0632aa38b7f0f5d52690.tar.bz2 cygnal-08d944e19fbbc9f4f81b0632aa38b7f0f5d52690.zip |
* 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/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.cc | 21 |
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); } |