From 27dd7bfbcda74cda15a04d90bafb207ece252583 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 2 May 2011 18:41:10 +0000 Subject: [PATCH] * fhndler_tty.cc (andler_pty_master::process_slave_output): Make interruptible and cancelable. Fix nonblocking case. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler_tty.cc | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 94549185e..e7f155dff 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2011-05-02 Corinna Vinschen + + * fhndler_tty.cc (andler_pty_master::process_slave_output): Make + interruptible and cancelable. Fix nonblocking case. + 2011-05-02 Corinna Vinschen * fhandler_console.cc (fhandler_console::read): Make restartable and diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index e6c4f3fb7..5b0a1c595 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -305,16 +305,23 @@ fhandler_pty_master::process_slave_output (char *buf, size_t len, int pktmode_on if (hit_eof ()) goto out; /* DISCARD (FLUSHO) and tcflush can finish here. */ - if (n == 0 && (get_ttyp ()->ti.c_lflag & FLUSHO || !buf)) + if ((get_ttyp ()->ti.c_lflag & FLUSHO || !buf)) goto out; - if (n == 0 && is_nonblocking ()) + if (is_nonblocking ()) { set_errno (EAGAIN); rc = -1; - break; + goto out; } - - Sleep (10); + pthread_testcancel (); + if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0 + && !_my_tls.call_signal_handler ()) + { + set_errno (EINTR); + rc = -1; + goto out; + } + } if (ReadFile (handle, outbuf, rlen, &n, NULL) == FALSE)