diff options
author | Christopher Faylor <me@cgf.cx> | 2004-01-23 18:22:48 +0300 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2004-01-23 18:22:48 +0300 |
commit | a33df42223e3261d26975db9a92945a187471fac (patch) | |
tree | f9baebf4c6ce6844bd3fe9f621b81f1c69a9b247 /winsup/cygwin/fhandler_serial.cc | |
parent | ed1a95dc2529af31b0c622da451334a12ef6d436 (diff) |
* fhandler_serial.cc (fhandler_serial::raw_write): Prevent a deadlock when the
input buffer overflows.
(fhandler_serial::raw_read): Correct to print the actual error and only call
PurgeComm when necessary.
Diffstat (limited to 'winsup/cygwin/fhandler_serial.cc')
-rw-r--r-- | winsup/cygwin/fhandler_serial.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc index efb1af99b..c5e1f6d98 100644 --- a/winsup/cygwin/fhandler_serial.cc +++ b/winsup/cygwin/fhandler_serial.cc @@ -133,16 +133,16 @@ fhandler_serial::raw_read (void *ptr, size_t& ulen) continue; err: - PurgeComm (get_handle (), PURGE_RXABORT); debug_printf ("err %E"); - if (GetLastError () == ERROR_OPERATION_ABORTED) - n = 0; - else + if (GetLastError () != ERROR_OPERATION_ABORTED) { + PurgeComm (get_handle (), PURGE_RXABORT); tot = -1; __seterrno (); break; } + + n = 0; } out: @@ -169,6 +169,11 @@ fhandler_serial::raw_write (const void *ptr, size_t len) switch (GetLastError ()) { case ERROR_OPERATION_ABORTED: + DWORD ev; + if (!ClearCommError (get_handle (), &ev, NULL)) + goto err; + if (ev) + termios_printf ("error detected %x", ev); continue; case ERROR_IO_PENDING: break; |