diff options
author | Christopher Faylor <me@cgf.cx> | 2011-12-13 08:11:48 +0400 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2011-12-13 08:11:48 +0400 |
commit | 8cb58e85662d1a0c3288020780ce2389850dc465 (patch) | |
tree | 50aab7377010623e33643cd83deb564e747a5de7 /winsup/cygwin/sigproc.h | |
parent | a7ea1550ff7a0a1dde12676fdcf25bf05937ca72 (diff) |
* cygthread.h (cygthread::name): Very minor formatting tweak.
* exceptions.cc (_cygtls::call_signal_handler): Add paranoid debugging output.
* sigproc.h (cygwait): Call signal handler when signal is detected and loop as
appropriate.
* fhandler.h (fhandler_base_overlapped::wait_return): Remove overlapped_signal.
* fhandler.cc (fhandler_base_overlapped::wait_overlapped): Remove restartable
signal accommodations in light of cygwait improvements.
(fhandler_base_overlapped::raw_read): Remove now-obsolete signal loop behavior.
(fhandler_base_overlapped::raw_write): Ditto.
* fhandler_console.cc (fhandler_console::read): Ditto.
* fhandler_serial.cc (fhandler_serial::raw_read): Ditto.
(fhandler_serial::raw_write): Ditto.
* fhandler_tty.cc (fhandler_pty_slave::read): Ditto.
* ioctl.cc (ioctl): Add standard syscall introducer and leaver debug output.
Diffstat (limited to 'winsup/cygwin/sigproc.h')
-rw-r--r-- | winsup/cygwin/sigproc.h | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index 72427a4c2..0cfac8699 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -85,13 +85,24 @@ static inline DWORD __attribute__ ((always_inline)) cygwait (HANDLE h, DWORD howlong = INFINITE) { HANDLE w4[3]; - int n = 0; - if ((w4[n] = h) != NULL) - n++; + DWORD n = 0; + DWORD wait_signal; + if ((w4[n] = h) == NULL) + wait_signal = WAIT_OBJECT_0 + 15; /* Arbitrary. Don't call signal + handler if only waiting for signal */ + else + { + n++; + wait_signal = n; + } w4[n++] = signal_arrived; if ((w4[n] = pthread::get_cancel_event ()) != NULL) n++; - return WaitForMultipleObjects (n, w4, FALSE, howlong); + DWORD res; + while ((res = WaitForMultipleObjects (n, w4, FALSE, howlong)) == wait_signal + && _my_tls.call_signal_handler ()) + continue; + return res; } static inline DWORD __attribute__ ((always_inline)) |