Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2011-12-13 08:11:48 +0400
committerChristopher Faylor <me@cgf.cx>2011-12-13 08:11:48 +0400
commit8cb58e85662d1a0c3288020780ce2389850dc465 (patch)
tree50aab7377010623e33643cd83deb564e747a5de7 /winsup/cygwin/sigproc.h
parenta7ea1550ff7a0a1dde12676fdcf25bf05937ca72 (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.h19
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))