* sigproc.cc (signal_exit): Revert reversion of 2011-12-04 change since,

otherwise, you see hangs when the signal pipe is closed.
This commit is contained in:
Christopher Faylor 2011-12-09 06:49:10 +00:00
parent 8714982cef
commit e35f1d1655
3 changed files with 26 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-12-09 Christopher Faylor <me.cygwin2011@cgf.cx>
* sigproc.cc (signal_exit): Revert reversion of 2011-12-04 change
since, otherwise, you see hangs when the signal pipe is closed.
2011-12-08 Christopher Faylor <me.cygwin2011@cgf.cx>
* select.cc (cygwin_select): Fifth time is the charm.

View File

@ -221,9 +221,12 @@ close_handle (const char *func, int ln, HANDLE h, const char *name, bool force)
lock_debug here;
if (!mark_closed (func, ln, h, name, force))
return false;
debug_printf ("here 1");
SetHandleInformation (h, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0);
debug_printf ("here 2");
ret = CloseHandle (h);
debug_printf ("here 3, ret %d", ret);
if (!ret)
{

View File

@ -376,10 +376,26 @@ _cygtls::signal_exit (int rc)
{
extern void stackdump (DWORD, int, bool);
HANDLE myss = my_sendsig;
my_sendsig = NULL; /* Make no_signals_allowed return true */
close_my_readsig ();
SetEvent (signal_arrived); /* Avoid potential deadlock with proc_lock */
/* This code used to try to always close my_readsig but it ended up
blocking for reasons that people in google think make sense.
It's possible that it was blocking because ReadFile was still active
but it isn't clear why this only caused random hangs rather than
consistent hangs. So, for now at least, avoid closing my_readsig
unless this is the signal thread. */
if (&_my_tls == _sig_tls)
close_my_readsig (); /* Stop any currently executing sig_sends */
else
{
sigpacket sp = {};
sp.si.si_signo = __SIGEXIT;
DWORD len;
/* Write a packet to the wait_sig thread which tells it to exit and
close my_readsig. */
WriteFile (myss, &sp, sizeof (sp), &len, NULL);
}
if (rc == SIGQUIT || rc == SIGABRT)
{