public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
From: Corinna Vinschen <corinna-cygwin@cygwin.com>
To: cygwin@cygwin.com
Subject: Re: Setting termios VMIN > 0 and VTIME > 0 on non blocking file
Date: Fri, 13 Mar 2020 11:12:47 +0100	[thread overview]
Message-ID: <20200313101247.GD512788@calimero.vinschen.de> (raw)
In-Reply-To: <9e56e005-660b-373e-d557-9c8bc97c45ba@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 2908 bytes --]

On Mar 12 18:04, Åke Rehnman via Cygwin wrote:
> 
> On 2020-03-12 16:08, Corinna Vinschen wrote:
> > On Mar 12 15:44, Corinna Vinschen wrote:
> > > On Mar 12 15:20, Åke Rehnman via Cygwin wrote:
> > > > I think the problem is if the number of bytes requested are more than what
> > > To clarify: number of bytes == VMIN?
> no number of bytes requested from ReadFile(). As far as I know Win32 has no
> concept of VMIN.

Right, just this weird TimeoutMultiplier, but nevertheless I wasn't sure
what you meant.

> > > > is in the buffer it is going to overlap the read function (because of VTIME)
> > > > and immediately after that CancelIO is called. Contrary to what is mentioned
> > > > in the source code I think CancelIO is actually discarding data...
> > > So far we didn't have that experience.  CancelIO is usually safe
> > > in this regard.
> The data is MIA somehow...

Yes, but we're calling CancelIo in other circumstances in Cygwin and
there were no reports of missing data.  CancelIo is just supposed to
terminate the currently running overlapped IO, not to discard any
in-flight data.  If that's different for serial IO, there would be no
way to terminate serial overlapped IO gracefully.  Well, yeah, it's
Windows, but still...

> > > > -    if ((vmin_ > 0) && (vtime_ == 0))
> > > > +       if (is_nonblocking())
> > > > +       {
> > > > +               to.ReadIntervalTimeout = MAXDWORD;
> > > > +       }
> > > > +    else if ((vmin_ > 0) && (vtime_ == 0))
> > > What if you switch to !O_NONBLOCK after calling tcsetattr?  The
> > > setting of ReadIntervalTimeout would be lost then.
> > > 
> > > Either we have to repeat calling SetCommTimeouts every time
> > > we switch mode, or we have to do the above setting temporary
> > > every time we call ReadFile in non blocking mode.
> True.
> > What about this:
> > 
> > diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc
> > --- a/winsup/cygwin/fhandler_serial.cc
> > +++ b/winsup/cygwin/fhandler_serial.cc
> > @@ -68,6 +68,16 @@ fhandler_serial::raw_read (void *ptr, size_t& ulen)
> >   	goto err;
> >         else if (ev)
> >   	termios_printf ("error detected %x", ev);
> > +      else if (is_nonblocking ())
> > +	{
> > +	  if (!st.cbInQue)
> > +	    {
> > +	      tot = -1;
> > +	      set_errno (EAGAIN);
> > +	      goto out;
> > +	    }
> > +	  inq = st.cbInQue;
> > +	}
> >         else if (st.cbInQue && !vtime_)
> >   	inq = st.cbInQue;
> >         else if (!is_nonblocking () && !overlapped_armed)
> 
> Looks promising. I will try it.
> 
> BTW there is a gremlin in the "else if (ev)" line....

A gremlin?  Would you mind to explain?  Btw., if you find a bug
in the code, we do take patches :) https://cygwin.com/contrib.html


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2020-03-13 10:12 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.1473.1583981776.15804.cygwin@cygwin.com>
2020-03-11 20:48 ` Åke Rehnman
2020-03-11 21:55   ` Brian Inglis
2020-03-12  1:01     ` Norton Allen
2020-03-12  1:04     ` Åke Rehnman
2020-03-12  1:08       ` Norton Allen
2020-03-12  1:39         ` Åke Rehnman
2020-03-12  8:05   ` Thomas Dickey
2020-03-12 11:01     ` Åke Rehnman
2020-03-12 19:48     ` Achim Gratz
2020-03-12 11:40   ` Corinna Vinschen
2020-03-12 13:32     ` Åke Rehnman
2020-03-12 14:13       ` Corinna Vinschen
2020-03-12 16:42         ` Åke Rehnman
2020-03-13 10:02           ` Corinna Vinschen
2020-03-12 14:20     ` Åke Rehnman
2020-03-12 14:44       ` Corinna Vinschen
2020-03-12 15:08         ` Corinna Vinschen
2020-03-12 17:04           ` Åke Rehnman
2020-03-13 10:12             ` Corinna Vinschen [this message]
2020-03-14 10:23               ` Åke Rehnman
2020-03-14 10:36                 ` Åke Rehnman
2020-03-16  9:35                   ` Corinna Vinschen
2020-03-17 12:16                     ` Corinna Vinschen
2020-03-17 15:54                       ` Åke Rehnman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200313101247.GD512788@calimero.vinschen.de \
    --to=corinna-cygwin@cygwin.com \
    --cc=cygwin@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).