From: Christopher Faylor Date: Tue, 15 Jul 2014 22:11:23 +0000 (+0000) Subject: * sigproc.cc (sigproc_init): Set aside more buffer space for signal pipes. X-Git-Tag: cygwin-1_7_31-release~9 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=6f05b327678f5081df227a6b11aed66837b82971;p=newlib-cygwin.git * 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. --- 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. */