From 6f05b327678f5081df227a6b11aed66837b82971 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 15 Jul 2014 22:11:23 +0000 Subject: * sigproc.cc (sigproc_init): Set aside more buffer space for signal pipes. (sig_send): Retry WriteFiles which fail when there is no error but packbytes have not been sent. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/sigproc.cc | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'winsup/cygwin') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c8ed712ff..d1bac2ff0 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2014-07-15 Christopher Faylor + + * sigproc.cc (sigproc_init): Set aside more buffer space for signal + pipes. + (sig_send): Retry WriteFiles which fail when there is no error but + packbytes have not been sent. + 2014-07-15 Christopher Faylor * sigproc.cc (send_sig): Don't report an error if WriteFile succeeds. diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index a530c89ca..f04c01386 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -426,7 +426,7 @@ sigproc_init () char char_sa_buf[1024]; PSECURITY_ATTRIBUTES sa = sec_user_nih ((PSECURITY_ATTRIBUTES) char_sa_buf, cygheap->user.sid()); DWORD err = fhandler_pipe::create (sa, &my_readsig, &my_sendsig, - sizeof (sigpacket), "sigwait", + NSIG * sizeof (sigpacket), "sigwait", PIPE_ADD_PID); if (err) { @@ -635,7 +635,19 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) } DWORD nb; - if (!WriteFile (sendsig, leader, packsize, &nb, NULL)) + BOOL res; + /* Try multiple times to send if packsize != nb since that probably + means that the pipe buffer is full. */ + for (int i = 0; i < 100; i++) + { + res = WriteFile (sendsig, leader, packsize, &nb, NULL); + if (!res || packsize == nb) + break; + Sleep (10); + res = 0; + } + + if (!res) { /* Couldn't send to the pipe. This probably means that the process is exiting. */ -- cgit v1.2.3