From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by sourceware.org (Postfix) with ESMTPS id 15782396E85E for ; Thu, 12 Mar 2020 15:08:34 +0000 (GMT) Received: from calimero.vinschen.de ([24.134.7.25]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M593i-1jDVuX49rg-0016N4 for ; Thu, 12 Mar 2020 16:08:34 +0100 Received: by calimero.vinschen.de (Postfix, from userid 500) id 70485A82791; Thu, 12 Mar 2020 16:08:33 +0100 (CET) Date: Thu, 12 Mar 2020 16:08:33 +0100 From: Corinna Vinschen To: cygwin@cygwin.com Subject: Re: Setting termios VMIN > 0 and VTIME > 0 on non blocking file Message-ID: <20200312150833.GQ4042@calimero.vinschen.de> Reply-To: cygwin@cygwin.com Mail-Followup-To: cygwin@cygwin.com References: <9e4c6428-59de-df07-9e33-44ba95d5497f@gmail.com> <20200312114041.GJ4042@calimero.vinschen.de> <365dd437-7553-eb4e-3253-aba3bab74895@gmail.com> <20200312144445.GP4042@calimero.vinschen.de> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="worL9B4ITIAQZ1FS" Content-Disposition: inline In-Reply-To: <20200312144445.GP4042@calimero.vinschen.de> X-Provags-ID: V03:K1:3nl2k0X7REWWfRkyoBVVIc3xeNeVHaQdu/MkZ22Dma9V5EKkkoJ FF3yv/sYPY6t2hCJm7bv1CQUhwhws80uaG61GAp40DmLEbZN7BL4zla8DJoQWE/98HVSsLG JwGU98gQMLDBwUgbdmYcTUsKRf6+//4CbepG/6f4JjoNPz3VAY8mnKbE8Nsb4Vj0NT11nsR lvrKK+kUyzzaALXZz5k5g== X-UI-Out-Filterresults: notjunk:1;V03:K0:60F8ho/S8S8=:vdpOj2fM1cI2sV0I+e4JV7 v/qzg9QurvxdfdFfo92wcnVZ90YseF2lwWsN0OS/rXCyYMEYjicbDgZqJZK6M82fVivNjyCNR 7QWtRBNckozDVIHY0dzCpxb0kW4Emxd1jK0vIriHyXIlafgxzU6aMHZMaYL+6VaVAtggX4AhV y38WhZYV5yfAnUCkeIeXBikkujd5rszNZjebK7hyRJYohE57ilufJV+9uouLEcNiD+t6HHEM+ dw4vaDngM1yxyNOf3w53GENS/IQktbzSHJe3ZKSapLK6LKad2/dTwsMAQHDev5PGimKfKi5hK mGbfh51gRLQWRV6cYCG7H2P7HBKiOBHipD1qbT8HYYbcrtCRXXmm8MJalIVA8lRxnexh6TWle NNK8RQt1kIlZl6h590++M5mlv9YJZLdNIdTNA4NxFDcN6ZFB/B0HPSJRCrABTDpSDeOQFSefk 7w90coPxbjIJ+Vtf5C8L3Zkmlicf00+5L7BzKDXnKmY5ncPeTpYsaGVDp0QVWKy9ZPjb65rxb QveKCmL/AtCJ3l8g2Se6/njIkjxFPs1UdANkyNJZhYl+tLl0W72hMHWpkAz3dDdsVJ1gEQ8to YhGE/L1YialjyU/8Z46YIE8ysHgjGsG8kdNBLTEE7dOMx4ooD4DlLJckFi8I7W2VjzgUfF/cY sOTWrN92eemEq+lx57hIZO9jElfTXT28iST/BBmJpvVNjjaEhCLF0kS/y9UFmqjaqOEeIrtov YAp86iRcmvy4ckmWDKVYkSEaZWaeL5ClbhfqgWWx+d2+3jcKY/GTPmOnLZQauMlwqQ/XbK2xV ChmGqPS5/C2Lx2iWi6a83btL4mDj0EcAdjNvxF5y+O+uEHmgbVq7qa2+sR0nL2kd+3pY77U 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@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Mar 2020 15:08:36 -0000 --worL9B4ITIAQZ1FS Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mar 12 15:44, Corinna Vinschen wrote: > On Mar 12 15:20, =C3=85ke Rehnman via Cygwin wrote: > > I think the problem is if the number of bytes requested are more than w= hat >=20 > To clarify: number of bytes =3D=3D VMIN? >=20 > > is in the buffer it is going to overlap the read function (because of V= TIME) > > and immediately after that CancelIO is called. Contrary to what is ment= ioned > > in the source code I think CancelIO is actually discarding data... >=20 > So far we didn't have that experience. CancelIO is usually safe > in this regard. >=20 > > =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 discar= ds in-flight bytes while CancelIo > > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 only stops the overlapped I= O 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 stru= ct > > 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)) >=20 > What if you switch to !O_NONBLOCK after calling tcsetattr? The > setting of ReadIntervalTimeout would be lost then. >=20 > 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. What about this: diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_seri= al.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 =3D -1; + set_errno (EAGAIN); + goto out; + } + inq =3D st.cbInQue; + } else if (st.cbInQue && !vtime_) inq =3D st.cbInQue; else if (!is_nonblocking () && !overlapped_armed) Corinna --=20 Corinna Vinschen Cygwin Maintainer --worL9B4ITIAQZ1FS Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEoVYPmneWZnwT6kwF9TYGna5ET6AFAl5qUHEACgkQ9TYGna5E T6DXeBAAj9Fry9Zf3MXUtyGGy8v54eyrH2iYq3Z1WxauE2Nzz00wVj3wrEDdmnC1 zjE+WI/x/YuEvI5nZVhcgVMzR4srhqi0QMWwV30ATN8cFTclWAzGy8L0d4PaHTcJ e5xP1c6Hn3DyzgOjmBy8Vhm0z+GXiTfPp5dk96ShC4ycrUjbbu6AFcs/7SF+BH9v qaFHQKrxorErp0GdQF2OU/BZHPC7tUrAF0SMvU/arTY1knFsNFG4E7ublMttVfwU Fp1UEfI/u2+yMNQh4GjOc87qusLzPxsbXuTqbWGhQm2q8cHKC3X7suxxNkAmLrXb 2oVsoqqhImv0Ze/frZOP70Q8TQlTOwwwa9vgqJrZvUyec1gRlaM7HFKmxVy0scxt +OuQc8GGqfZOgFKeGCoIytH5Uv2N/B3/PXR95oABwhoECs1z8ThHZ1jI9EQe/HMn GXZe5dwZOISJOkV1IweHy45P4kOML1SR9bGpaboiszY/M+cTld17V+Lyh1wMWA6N fBIesLeNld6Col/D6FEgaciueVQ58Z/S+anKM16EvN88zt1Is2xhlDtkvsa5A3Q3 ip8vSnXfbgXOndr/dO4vOEt3CR+heX+imAqp1O4Q1iKsa1KvoX1DWAh1m71TMZO7 IQjhQnoW84zqSinQeuJCAun4hFk8hAscPLddshfq7UqVGsdAByY= =Nkc/ -----END PGP SIGNATURE----- --worL9B4ITIAQZ1FS--