From e4f70cddcdf651f667bc32250477d3092ca431b3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 2 May 2011 17:38:16 +0000 Subject: [PATCH] * fhandler_console.cc (fhandler_console::read): Make restartable and cancelable. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler_console.cc | 26 ++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7b6ae0478..94549185e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2011-05-02 Corinna Vinschen + + * fhandler_console.cc (fhandler_console::read): Make restartable and + cancelable. + 2011-05-02 Christopher Faylor * strace.cc (strace::vprntf): Avoid closing unopened handle. 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; }