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:
authorCorinna Vinschen <corinna@vinschen.de>2011-05-02 21:38:16 +0400
committerCorinna Vinschen <corinna@vinschen.de>2011-05-02 21:38:16 +0400
commite4f70cddcdf651f667bc32250477d3092ca431b3 (patch)
tree2b5ae114ced3fb7d19b750bf81cb6ec03b07865e /winsup/cygwin/fhandler_console.cc
parentd85a0c243bfcf4d53806fb216ad3d1b647b59dcd (diff)
* fhandler_console.cc (fhandler_console::read): Make restartable and
cancelable.
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;
}