Mail Archives: cygwin-developers/2000/12/17/19:07:50
Nevermind. I understand now. I was confused by the fact that this code
should not have been triggered unless the 'ready_for_read' had indicated that
there was stuff to read.
Does the below patch work for you? It avoids code duplication.
cgf
On Fri, Dec 15, 2000 at 09:58:42PM -0500, Christopher Faylor wrote:
>Ok. Can you provide a little bit of an explanation on why this
>solves your problem. It doesn't make any sense to me that it would
>by reading the code.
>
>cgf
>
>On Fri, Dec 15, 2000 at 06:53:31PM -0800, Dan Morris wrote:
>>My bad... I totally spaced on even giving a filename. Here's a better diff :
>>
>>--- fhandler_serial.cc-orig Fri Dec 15 18:45:26 2000
>>+++ fhandler_serial.cc Fri Dec 15 00:28:04 2000
>>@@ -119,6 +119,13 @@ fhandler_serial::raw_read (void *ptr, si
>> }
>> }
>>
>>+ if (overlapped_armed) {
>>+ if (!ClearCommError (get_handle (), &ev, &st))
>>+ goto err;
>>+ else if (st.cbInQue)
>>+ inq = st.cbInQue;
>>+ }
>>+
>> overlapped_armed = 0;
>> ResetEvent (io_status.hEvent);
>> if (inq > ulen)
>>
>>-Dan
>>
>>On Fri, 15 Dec 2000, Christopher Faylor wrote:
>>
>>> I think this is coming from fhandler_serial.cc but I don't know for
>>> sure. Can you provide a unified diff? A complete unified diff will
>>> show the filename and give a little more context.
>>>
>>> The contributing link on http://cygwin.com should give you some pointers on how
>>> to do this and how to provide a patch.
>>>
>>> cgf
>>>
>>> On Fri, Dec 15, 2000 at 05:38:09PM -0800, Dan Morris wrote:
>>> >Has anyone else had problems with serial port reads blocking even when
>>> >O_NONBLOCK is passed to _read in the 1.1.6-1 DLL?
>>> >
>>> >I noticed that my reads were appropriately non-blocking most of the time, but
>>> >blocked whenever "overlapped_armed" was set, because in this case raw_read
>>> >never finds out how many bytes are in the serial port's buffer. This patch
>>> >seems to fix the problem for me :
>>> >
>>> >121a122,128
>>> >> if (overlapped_armed) {
>>> >> if (!ClearCommError (get_handle (), &ev, &st))
>>> >> goto err;
>>> >> else if (st.cbInQue)
>>> >> inq = st.cbInQue;
>>> >> }
>>> >>
>>> >
>>> >If anyone else has found a better solution to this problem, let me know...
>>> >otherwise perhaps this patch will fix things.
Sun Dec 17 19:03:52 2000 Christopher Faylor <cgf AT cygnus DOT com>
* fhandler_serial.cc (fhandler_serial::raw_read): Always find number of
bytes ready to be read whether overlapped_armed or not.
Index: fhandler_serial.cc
===================================================================
RCS file: /cvs/uberbaum/winsup/cygwin/fhandler_serial.cc,v
retrieving revision 1.9
diff -u -p -r1.9 fhandler_serial.cc
--- fhandler_serial.cc 2000/09/08 02:56:54 1.9
+++ fhandler_serial.cc 2000/12/18 00:07:05
@@ -79,15 +79,16 @@ fhandler_serial::raw_read (void *ptr, si
// if vmin > ulen then things won't work right.
overlapped_armed = -1;
}
- if (!overlapped_armed)
+
+ if (!ClearCommError (get_handle (), &ev, &st))
+ goto err;
+ else if (ev)
+ termios_printf ("error detected %x", ev);
+ else if (st.cbInQue)
+ inq = st.cbInQue;
+ else if (!overlapped_armed)
{
- if (!ClearCommError (get_handle (), &ev, &st))
- goto err;
- else if (ev)
- termios_printf ("error detected %x", ev);
- else if (st.cbInQue)
- inq = st.cbInQue;
- else if ((size_t)tot >= minchars)
+ if ((size_t)tot >= minchars)
break;
else if (WaitCommEvent (get_handle (), &ev, &io_status))
{
- Raw text -