Subject: Re: Serial I/O Multi-thread safe - FIX
From: Christopher Faylor <[email-masked]>
To: [email-masked]
Cc: [email-masked]
Date: Sun, 28 Jan 2001 20:06:02 -0500

Any word on this?  It would be nice to get this into 1.1.8.

cgf

On Sat, Jan 20, 2001 at 12:01:04PM -0500, Christopher Faylor wrote:
>On Sat, Jan 20, 2001 at 08:56:23AM -0800, Bill Hegardt wrote:
>>Here is a fix for the problem I posted back on January 12th. The
>>problem lies in fhandler_serial.cc
>>
>>The problem is that both the raw_read() and raw_write() functions use
>>the same io_status structure. My fix below
>>creates a local structure called osWrite in the raw_write function. This
>>may not be the best way to solve the
>>problem, but it works. I have built cygwin1.dll, tested it, and the problem 
>>is solved. Serial I/O seems solid now.
>>
>>I have a document from Microsoft that explains: "A common mistake in
>>overlapped I/O is to reuse an OVERLAPPED structure
>>before the previous overlapped operation is completed". In my
>>application, one thread was blocked on a read while another
>>thread issued a write on the same handle.
>>
>>My hope is that this fix or something similar will find its
>>way into an upcoming release.
>
>I am willing to apply this, or something like it, but I'd appreciate a
>ChangeLog and a patch.  See the "Contributing" link at the Cygwin web
>page for more details.
>
>cgf
>
>>Thanks
>>
>>- Bill
>>
>>----- Cut here ------
>>
>>/* Cover function to WriteFile to provide Posix interface and semantics
>>   (as much as possible).  */
>>int
>>fhandler_serial::raw_write (const void *ptr, size_t len)
>>{
>>  DWORD bytes_written;
>>  OVERLAPPED osWrite;
>>
>>  memset (&osWrite, 0, sizeof (osWrite));
>>  osWrite.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
>>  ProtectHandle (osWrite.hEvent);
>>
>>  if (overlapped_armed)
>>    PurgeComm (get_handle (), PURGE_TXABORT | PURGE_RXABORT);
>>
>>  for (;;)
>>    {
>>      overlapped_armed = TRUE;
>>      if (WriteFile (get_handle(), ptr, len, &bytes_written, &osWrite))
>>        break;
>>
>>      switch (GetLastError ())
>>        {
>>          case ERROR_OPERATION_ABORTED:
>>            continue;
>>          case ERROR_IO_PENDING:
>>            break;
>>          default:
>>            goto err;
>>        }
>>
>>      if (!GetOverlappedResult (get_handle (), &osWrite, &bytes_written,
>>TRUE))
>>        goto err;
>>
>>      break;
>>    }
>>
>>  CloseHandle(osWrite.hEvent);
>> 
>>  overlapped_armed = FALSE;
>>  return bytes_written;
>>
>>err:
>>  CloseHandle(osWrite.hEvent);
>>  __seterrno ();
>>  return -1;
>>}

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple