+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.
}
}
+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. */
{
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 */
break;
}
- ForceCloseHandle (my_readsig);
+ close_my_readsig ();
sigproc_printf ("signal thread exiting");
ExitThread (0);
}