summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_console.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r--winsup/cygwin/fhandler_console.cc26
1 files changed, 14 insertions, 12 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 456336c65..464de322e 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -262,19 +262,11 @@ fhandler_console::read (void *pv, size_t& buflen)
return;
}
- HANDLE w4[2];
- DWORD nwait;
+ HANDLE w4[3] = { h, signal_arrived, pthread::get_cancel_event () };
+ DWORD nwait = w4[2] ? 3 : 2;
+ DWORD timeout = is_nonblocking () ? 0 : INFINITE;
char tmp[60];
- w4[0] = h;
- if (&_my_tls != _main_tls)
- nwait = 1;
- else
- {
- w4[1] = signal_arrived;
- nwait = 2;
- }
-
termios ti = tc->ti;
for (;;)
{
@@ -286,12 +278,22 @@ fhandler_console::read (void *pv, size_t& buflen)
}
set_cursor_maybe (); /* to make cursor appear on the screen immediately */
- switch (WaitForMultipleObjects (nwait, w4, FALSE, INFINITE))
+restart:
+ switch (WaitForMultipleObjects (nwait, w4, FALSE, timeout))
{
case WAIT_OBJECT_0:
break;
case WAIT_OBJECT_0 + 1:
+ if (_my_tls.call_signal_handler ())
+ goto restart;
goto sig_exit;
+ case WAIT_OBJECT_0 + 2:
+ pthread::static_cancel_self ();
+ /*NOTREACHED*/
+ case WAIT_TIMEOUT:
+ set_sig_errno (EAGAIN);
+ buflen = (size_t) -1;
+ return;
default:
goto err;
}