delorie.com/archives/browse.cgi | search |
X-Recipient: | archive-cygwin AT delorie DOT com |
X-Original-To: | cygwin AT cygwin DOT com |
Delivered-To: | cygwin AT cygwin DOT com |
Date: | Thu, 12 Mar 2020 15:44:45 +0100 |
From: | Corinna Vinschen <corinna-cygwin AT cygwin DOT com> |
To: | cygwin AT cygwin DOT com |
Subject: | Re: Setting termios VMIN > 0 and VTIME > 0 on non blocking file |
Message-ID: | <20200312144445.GP4042@calimero.vinschen.de> |
Mail-Followup-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> | |
MIME-Version: | 1.0 |
In-Reply-To: | <365dd437-7553-eb4e-3253-aba3bab74895@gmail.com> |
X-Provags-ID: | V03:K1:ME/YLRObGbiuQj8CanUJ+kUklocskVaHH+xTpxP0VU1UAVCWfwv |
pgoK35zHgILcn5cGe5HQiDrRUMR3K0M5r/B7/3H4qjcXZHNXsMN+SawPO0Et3TfZkd5TXcr | |
iRuq/Grcl7Ujw5awGsEL4AiXQSCPfVQLjR0sfUGztDD/q+6gdmZ0NUCZkSb42r7irUvTS2n | |
lToPn7WZnxXB/Dnh5LDhA== | |
X-UI-Out-Filterresults: | notjunk:1;V03:K0:ZPaPW+/c5UI=:uDhkN7XRDy40KJT1/pqbEQ |
YeGaSupRpeohnOAXF1Iy+kXrVrgELmFSGN9ThTvRjQiQ5y05eH5vaTD8d98wEbXV1srhyAFUq | |
vGB3MNqXpBQpbW0pZrwW1/vAChzWz6j4Wz7zAveG+QJVcz88hfcz9/KbSfR61Qhf7lB8n/vs0 | |
KOr9HwO2HwkgFpAc5szBjHioUZntqEqKR3i93uro1PiMlm54P4R8Q81lXws+JbzLydfEkuDdY | |
ho0uxuQShkYj5e0py3pQhOG3mBEogp3nPcNbN2t54Q6q3EXU+AIrUOELbHd6P07HJXIzEPAr1 | |
XcAzVkIZv7QFk+U0Dnw45lZmyQpfnGkdbexE7el0XL/VgKXygxehkg2t6lLWbRSU3yCf29CJ4 | |
iTHiJY2ZeZdVfjB1BYpAimpqaDII0YqTg3o1zazWXzi4lvaMZfwRazKuOH/6qJhqcl95js9cf | |
E6dFVOGWr+9UXcym/i1Owq0YZe8ylpGVPcXBrj2tDQb5fR+ZNjV3GtjK5JHQaqegUcNrAUaYd | |
IG9S9uhZiufyyYICE5fQ9EdIZLHGkRX3cTqqEs+gUheLHzbqpx6uISJDTNb3Yz1wS1ida8Fbe | |
3TERYOSB8R2WB21LepPyoyT4Viy4rTLSw48SgWFVSXCcnIpzUzSM2q1z5bSA06x9znZaaHh1z | |
tZhYcIVqDJXbEXixyyghLD3FeUhDZ/HfSu4KNxgvlkRjbH7eJTa2bVoAvxACUp/xEMyE8/Joh | |
ew39//GqfFBroasC6wqsTM65dINLWgqy6RNTeFuqUt5N0BSIn19BwkByuygH1bS+ZrQTPB3D5 | |
TKUo6vTz81zwrfmu+gOv4+w2US+jAq3tHvvwSYDlqQDPkt2fggRkdxv1hD22bQ50TOOKjbL | |
X-Spam-Status: | No, score=-124.4 required=5.0 tests=BAYES_00, GARBLED_BODY, |
GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, GOOD_FROM_CORINNA_CYGWIN, | |
RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, | |
SPF_NONE 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> | |
Reply-To: | cygwin AT cygwin DOT com |
Errors-To: | cygwin-bounces AT cygwin DOT com |
Sender: | "Cygwin" <cygwin-bounces AT cygwin DOT com> |
--===============5939028530730237511== Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="jllsgs4PL/sXFNaa" Content-Disposition: inline --jllsgs4PL/sXFNaa Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mar 12 15:20, =C3=85ke Rehnman via Cygwin wrote: >=20 > On 2020-03-12 12:40, Corinna Vinschen wrote: > >=20 > > I inspected the serial I/O read function and I only see a subtil > > difference in terms of VMIN/VTIME which doesn't seem to be the culprit > > at first glance. In O_NONBLOCK mode, the underlying Windows function > > ReadFile is called unconditionally. My current hunch is this: > >=20 > > - If VMIN>0 && VTIME>0, the Windows equivalent of tcsetattr is > > told that VMIN>0. > >=20 > > - So, assuming VMIN =3D=3D 2 in Windows. If VTIME > 0, the Cygwin read > > function sets the number of bytes_to_read to 1 (this is old code, > > don't ask why). > Do you have a pointer to this? I can not find it... That's because it's not true. I created this mail during lunch break and screwed up. > > - My assumption now is that the ReadFile function fails because it's > > supposed to return only 1 char, but VMIN is > 1. > >=20 > > There are two issues here. > >=20 > > - If my assumption is correct, the tcsetattr function must not > > set the Windows VMIN equivalent to !=3D 0 in the O_NONBLOCK case. > >=20 > > - Also, as mention above, if VTIME > 0, Cygwin's read sets the number of > > bytes_to_read to 1. Weirdly, it does so even if there are more than > > 1 byte in the inbound queue. This sounds wrong to me. > >=20 > I think the problem is if the number of bytes requested are more than what To clarify: number of bytes =3D=3D VMIN? > is in the buffer it is going to overlap the read function (because of VTI= ME) > and immediately after that CancelIO is called. Contrary to what is mentio= ned > 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. > =C2=A0 /* Use CancelIo rather than PurgeComm (PURGE_RXABORT) since > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 PurgeComm apparently discards= in-flight bytes while CancelIo > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 only stops the overlapped IO = routine. */ >=20 >=20 > My suggestion is the following patch: >=20 > diff --git a/winsup/cygwin/fhandler_serial.cc > b/winsup/cygwin/fhandler_serial.cc > index 69e5768f6..afa8871bf 100644 > --- a/winsup/cygwin/fhandler_serial.cc > +++ b/winsup/cygwin/fhandler_serial.cc > @@ -898,7 +898,11 @@ fhandler_serial::tcsetattr (int action, const struct > termios *t) > =C2=A0=C2=A0 { > =C2=A0=C2=A0=C2=A0=C2=A0 memset (&to, 0, sizeof (to)); >=20 > -=C2=A0=C2=A0=C2=A0 if ((vmin_ > 0) && (vtime_ =3D=3D 0)) > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (is_nonblocking()) > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 { > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 to.ReadIntervalTimeout =3D MAXDWORD; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } > +=C2=A0=C2=A0=C2=A0 else if ((vmin_ > 0) && (vtime_ =3D=3D 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. Corinna --=20 Corinna Vinschen Cygwin Maintainer --jllsgs4PL/sXFNaa Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEoVYPmneWZnwT6kwF9TYGna5ET6AFAl5qSt0ACgkQ9TYGna5E T6AOcw//VFp4Ad+RksjMK9cBVZO9xH1jA1tlJwOE1U4ay6ArKiVGVZCWMckhXc/J SYaFhn2uovS00A9Qo8cQNDZZJZIXwYs3/16BuxBr0rkrJMbLcIs5qOwcGlS2UiJy eRPCqkZYtWWmamXsUqggcOiSuPlBYt9a4NQzt8v2joeb44y8dXj7S2Cc+sV9JvyA 3Svo0tPXah37dZ3wXZVg7rKtRUVSAlqt6PSsBA7gn6wdtEqRvOcHLZWA7BZ6vt0n nmyo+6kCHfz6qOj4pyTWNu8blGXZwNe5oPcCVYDwVCEZqy+3x4ayBNANeIRkurfD qeYklui9P+Fcjc696syucU7smdfQOGWpUNhMvC4RqS2DGTKhAa9ZdVM/uEoedTva OyF+0ocZOvFs89J8pAPsMv0Oms7WeppmP77qN1ZkLAFlWRuHY/1PR13veQL8b4aR 65eUyExFbPqnOf5DwhVycnkYglJegPU6rOf4Q6UKKkpHI11VgzdwLUfnv4103s9U NMSBoQU3z/ldOEIjAKJ5NpYoTVJ7SrBRs4S0Z7nlSK7V7pusaCMmmnK70b0277K5 XcAMqApjsutg9oZvMC0c/OWpNBpRxG6vqkNXWJUV2wT4gr/2ETxOBTP8FG/mLIVr VZLExwFFxFFCEY4C+Sz0EyCX5CS6nNADqJQaywl8jc7LRlbQ3TQ= =lLsn -----END PGP SIGNATURE----- --jllsgs4PL/sXFNaa-- --===============5939028530730237511== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline -- 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 --===============5939028530730237511==--
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |