delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2020/03/14/06:24:00

X-Recipient: archive-cygwin AT delorie DOT com
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:subject:to:references:from:message-id:date
:user-agent:mime-version:in-reply-to:content-transfer-encoding
:content-language;
bh=hay638EE10S/9KgvQUJbiJs1ZcWNg/JCtNZfl/40FQk=;
b=I2uxXEcSRXh0ZkpGyvHuoSYPWbmleH+p/qu80eZlmoed68qaCIcjb9YpxYScDoxjBt
gILENiyjIe5QIGXXk1i4ArVSXnts+U2tY554E3GUextUKLOWP1uQAZ74zoyP4W+BtOHx
k820RY5VGu5QznxzAsq/vVdxzinza3D9cZz9lEchLmb0Tq++Ec8+YadG5gaKPzpwiunV
SXErSZNwxVYwy6uqmVp/5IomwsHF82MyvjEWOLxOGQrK3UK6ATXZfsVoKS3JMuIAeJ6g
WFsdL2MQKOeaaoNqZ3r/POy5n4EVQ77uv8Augn/+zXXvkKNEd8etuDL2lgXJOOJurq03
Oq0A==
X-Gm-Message-State: ANhLgQ1u4eOPs8XPH9D+qbpz1Hq7eJGE0jDUjMt2ruAHBx3BabgmPu3I
UO8dGBwENeHZrcHxgQxlfUtDgQU8aP4=
X-Google-Smtp-Source: ADFU+vvrS41y6fHmCeUHcy74SRjmiNClkPjmneexPiDr6F9Xyn3tONbW2bq1IBySrR3d+dIdMdEB8w==
X-Received: by 2002:a05:651c:30d:: with SMTP id
a13mr10836488ljp.272.1584181389562;
Sat, 14 Mar 2020 03:23:09 -0700 (PDT)
Subject: Re: Setting termios VMIN > 0 and VTIME > 0 on non blocking file
To: cygwin AT cygwin DOT com
References: <9e4c6428-59de-df07-9e33-44ba95d5497f AT gmail DOT com>
<20200312114041 DOT GJ4042 AT calimero DOT vinschen DOT de>
<365dd437-7553-eb4e-3253-aba3bab74895 AT gmail DOT com>
<20200312144445 DOT GP4042 AT calimero DOT vinschen DOT de>
<20200312150833 DOT GQ4042 AT calimero DOT vinschen DOT de>
<9e56e005-660b-373e-d557-9c8bc97c45ba AT gmail DOT com>
<20200313101247 DOT GD512788 AT calimero DOT vinschen DOT de>
Message-ID: <2156fb6d-cba9-b70e-f8c0-7043ff52ffc3@gmail.com>
Date: Sat, 14 Mar 2020 11:23:02 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101
Thunderbird/68.5.0
MIME-Version: 1.0
In-Reply-To: <20200313101247.GD512788@calimero.vinschen.de>
X-Spam-Status: No, score=-17.7 required=5.0 tests=DKIM_SIGNED, DKIM_VALID,
DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GARBLED_BODY, GIT_PATCH_0,
GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,
SPF_PASS autolearn=ham autolearn_force=no version=3.4.2
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on
server2.sourceware.org
X-BeenThere: cygwin AT cygwin DOT com
X-Mailman-Version: 2.1.29
List-Id: Cygwin mailing list <cygwin.cygwin.com>
List-Unsubscribe: <http://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <http://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <http://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
From: =?utf-8?q?=C3=85ke_Rehnman_via_Cygwin?= <cygwin AT cygwin DOT com>
Reply-To: =?UTF-8?Q?=c3=85ke_Rehnman?= <ake DOT rehnman AT gmail DOT com>
Errors-To: cygwin-bounces AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces AT cygwin DOT com>
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id 02EANghb023578

On 2020-03-13 11:12, Corinna Vinschen wrote:
> 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...
I have scrutinized the microsoft serial driver reference implementation 
(https://github.com/microsoft/Windows-driver-samples/blob/master/serial/serial/read.c) 
and it looks to me as CancelIo does not purge any data. However since 
the driver is vendor dependent in my case FTDI it is impossible to know 
exactly what is going on since it is closed source.
>>>>> -    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.
Your patch works (for my test case and screen). Question is if we have 
to consider the case where ulen==0 ...
>>
>> 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
If we have an error event in ev it will make a blocking read even if 
VTIME==0.

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019