diff -cr cygwin-1.5.5-1.orig/winsup/cygwin/fhandler_serial.cc cygwin-1.5.5-1/winsup/cygwin/fhandler_serial.cc *** cygwin-1.5.5-1.orig/winsup/cygwin/fhandler_serial.cc Sat Jun 21 02:12:35 2003 --- cygwin-1.5.5-1/winsup/cygwin/fhandler_serial.cc Tue Jan 20 10:57:31 2004 *************** *** 153,174 **** int fhandler_serial::raw_write (const void *ptr, size_t len) { ! DWORD bytes_written; OVERLAPPED write_status; memset (&write_status, 0, sizeof (write_status)); write_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); ProtectHandle (write_status.hEvent); ! for (;;) { if (WriteFile (get_handle (), ptr, len, &bytes_written, &write_status)) break; switch (GetLastError ()) { ! case ERROR_OPERATION_ABORTED: ! continue; case ERROR_IO_PENDING: break; default: --- 153,179 ---- int fhandler_serial::raw_write (const void *ptr, size_t len) { ! DWORD bytes_written = 0; OVERLAPPED write_status; memset (&write_status, 0, sizeof (write_status)); write_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); ProtectHandle (write_status.hEvent); ! for (int prevent_deadlock=0 ; prevent_deadlock<10 ; prevent_deadlock++) { if (WriteFile (get_handle (), ptr, len, &bytes_written, &write_status)) break; switch (GetLastError ()) { ! case ERROR_OPERATION_ABORTED: { ! DWORD ev; ! COMSTAT st; ! if (!ClearCommError (get_handle (), &ev, &st)) ! __seterrno (); ! bytes_written = 0; ! continue; } case ERROR_IO_PENDING: break; default: