diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 618b8d88e..79b4e3cba 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2013-12-17 Christopher Faylor + + * sigproc.cc (sig_send): Set PIPE_NOWAIT for pipes which are not us. + 2013-12-17 Christopher Faylor * fhandler.h (fhandler_pty_master::~fhandler_pty_master): Delete. diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 906dc6a35..c65e7bb37 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -553,7 +553,16 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) } VerifyHandle (sendsig); if (!communing) - CloseHandle (hp); + { + CloseHandle (hp); + DWORD flag = PIPE_NOWAIT; + /* Set PIPE_NOWAIT here to avoid blocking when sending a signal. + (Yes, I know MSDN says not to use this) + We can't ever block here because it causes a deadlock when + debugging with gdb. */ + BOOL res = SetNamedPipeHandleState (sendsig, &flag, NULL, NULL); + sigproc_printf ("%d = SetNamedPipeHandleState (%y, PIPE_NOWAIT, NULL, NULL)", res, sendsig); + } else { si._si_commune._si_process_handle = hp;