From 97cb9b9de404248a3c117a2f391696732ce6e860 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 11 Dec 2003 18:07:42 +0000 Subject: [PATCH] * fhandler_serial.cc (fhandler_serial::tcflush): Simplify. Remove read polling loop to avoid a hang with streaming devices. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler_serial.cc | 37 ++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 899282a5a..3d1cab793 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2003-12-11 Brian Ford + + * fhandler_serial.cc (fhandler_serial::tcflush): Simplify. Remove + read polling loop to avoid a hang with streaming devices. + 2003-12-11 Christopher Faylor * pinfo.cc (_pinfo::set_ctty): Correct stupid typo. diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc index af3941228..efb1af99b 100644 --- a/winsup/cygwin/fhandler_serial.cc +++ b/winsup/cygwin/fhandler_serial.cc @@ -497,21 +497,30 @@ fhandler_serial::ioctl (unsigned int cmd, void *buffer) int fhandler_serial::tcflush (int queue) { - if (queue == TCOFLUSH || queue == TCIOFLUSH) - PurgeComm (get_handle (), PURGE_TXABORT | PURGE_TXCLEAR); + DWORD flags; - if (queue == TCIFLUSH || queue == TCIOFLUSH) - /* Input flushing by polling until nothing turns up - (we stop after 1000 chars anyway) */ - for (int max = 1000; max > 0; max--) - { - COMSTAT st; - if (!PurgeComm (get_handle (), PURGE_RXABORT | PURGE_RXCLEAR)) - break; - low_priority_sleep (100); - if (!ClearCommError (get_handle (), &ev, &st) || !st.cbInQue) - break; - } + switch (queue) + { + case TCOFLUSH: + flags = PURGE_TXABORT | PURGE_TXCLEAR; + break; + case TCIFLUSH: + flags = PURGE_RXABORT | PURGE_RXCLEAR; + break; + case TCIOFLUSH: + flags = PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR; + break; + default: + termios_printf ("Invalid tcflush queue %d", queue); + set_errno (EINVAL); + return -1; + } + + if (!PurgeComm (get_handle (), flags)) + { + __seterrno (); + return -1; + } return 0; }