diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-05-02 21:38:16 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-05-02 21:38:16 +0400 |
commit | e4f70cddcdf651f667bc32250477d3092ca431b3 (patch) | |
tree | 2b5ae114ced3fb7d19b750bf81cb6ec03b07865e /winsup/cygwin/fhandler_console.cc | |
parent | d85a0c243bfcf4d53806fb216ad3d1b647b59dcd (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.cc | 26 |
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; } |