This is the mail archive of the cygwin-developers@sources.redhat.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Serial blocking read


Well, I've checked this in.  I would appreciate if someone could actually
verify that my patch does the right thing.  I'm not set up to verify the
serial code anymore.

cgf

On Sun, Dec 17, 2000 at 07:07:01PM -0500, Christopher Faylor wrote:
>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@cygnus.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))
> 	    {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]