summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_serial.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-12-11 18:07:42 +0000
committerCorinna Vinschen <corinna@vinschen.de>2003-12-11 18:07:42 +0000
commit97cb9b9de404248a3c117a2f391696732ce6e860 (patch)
tree11dcae6cf62bd0730697d1bc6ebfd8f586ed2a4c /winsup/cygwin/fhandler_serial.cc
parent992406a5ea5adc93a4906ca6e4487efc5f28956e (diff)
downloadcygnal-97cb9b9de404248a3c117a2f391696732ce6e860.tar.gz
cygnal-97cb9b9de404248a3c117a2f391696732ce6e860.tar.bz2
cygnal-97cb9b9de404248a3c117a2f391696732ce6e860.zip
* fhandler_serial.cc (fhandler_serial::tcflush): Simplify. Remove
read polling loop to avoid a hang with streaming devices.
Diffstat (limited to 'winsup/cygwin/fhandler_serial.cc')
-rw-r--r--winsup/cygwin/fhandler_serial.cc37
1 files changed, 23 insertions, 14 deletions
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;
}