Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Feb 2018 19:56:20 -0800
From:      Mark Millard <marklmi26-fbsd@yahoo.com>
To:        Eitan Adler <lists@eitanadler.com>
Cc:        FreeBSD Hackers <freebsd-hackers@freebsd.org>, FreeBSD Standards <freebsd-standards@freebsd.org>
Subject:   Re: Marking select(2) as restrict
Message-ID:  <9438AC5E-56B8-46E4-AECE-5C3A194F4D1E@yahoo.com>
In-Reply-To: <CAF6rxg=h_oMiUu7P=GAOQf_OySQM2w31hg6Kas%2B3jeEM3qq_Cg@mail.gmail.com>
References:  <CAF6rxg=h_oMiUu7P=GAOQf_OySQM2w31hg6Kas%2B3jeEM3qq_Cg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help


On 2018-Feb-15, at 12:10 AM, Eitan Adler <lists@eitanadler.com> wrote:

> Hi all,
>=20
> POSIX requires that the fd_set arguments in select(2) be marked as
> restrict. This patch attempts to implement that.
>=20
> (a) Am I missing anything?
> (b) Anything in particular to watch out for?
> (c) Assuming an exp-run passes any reason not to commit?
>=20
>=20
> Index: lib/libc/sys/select.2
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- lib/libc/sys/select.2 (revision 329296)
> +++ lib/libc/sys/select.2 (working copy)
> @@ -39,7 +39,7 @@
> .Sh SYNOPSIS
> .In sys/select.h
> .Ft int
> -.Fn select "int nfds" "fd_set *readfds" "fd_set *writefds" "fd_set
> *exceptfds" "struct timeval *timeout"
> +.Fn select "int nfds" "fd_set * restrict readfds" "fd_set * restrict
> writefds" "fd_set * restrict exceptfds" "struct timeval *timeout"
> .Fn FD_SET fd &fdset
> .Fn FD_CLR fd &fdset
> .Fn FD_ISSET fd &fdset
> Index: lib/libc/sys/select.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- lib/libc/sys/select.c (revision 329296)
> +++ lib/libc/sys/select.c (working copy)
> @@ -41,7 +41,7 @@ __weak_reference(__sys_select, __select);
>=20
> #pragma weak select
> int
> -select(int n, fd_set *rs, fd_set *ws, fd_set *es, struct timeval *t)
> +select(int n, fd_set * restrict rs, fd_set * restrict ws, fd_set *
> restrict es, struct timeval *t)
> {
>=20
>  return (((int (*)(int, fd_set *, fd_set *, fd_set *, struct timeval =
*))
> Index: sys/sys/select.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- sys/sys/select.h (revision 329296)
> +++ sys/sys/select.h (working copy)
> @@ -101,8 +101,7 @@ int pselect(int, fd_set *__restrict, fd_set *__res
>  const struct timespec *__restrict, const sigset_t *__restrict);
> #ifndef _SELECT_DECLARED
> #define _SELECT_DECLARED
> -/* XXX missing restrict type-qualifier */
> -int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
> +int select(int, fd_set *__restrict, fd_set *__restrict, fd_set
> *__restrict, struct timeval *);
> #endif
> __END_DECLS
> #endif /* !_KERNEL */

Going in a different direction: C++ . . .

=46rom FreeBSD's cdefs.h :

#if !(__GNUC__ =3D=3D 2 && __GNUC_MINOR__ =3D=3D 95)
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901
#define	__restrict
#else
#define	__restrict	restrict
#endif
#endif

It looks to me like C++ use of cdefs.h and then,
say, select.h, could easily lead to __restrict
being translated to no-text. C++11 does add
__STDC_VERSION__ to the "implementation-defined
value, if present" category. (Quoted material
is from en.cppreference.com .)

This would lead C++ to not give errors/warnings
for violating the constraints involved in calling
a newly Linux-like implementation of select (with
C99-like restrict involved).

It also means that if some C++ compilers have a
__restrict (-like) extension that it is not being
put to use for either code generation or for
reporting violations of C99-like constraints.

Of course if a C++11 or later targeting defines
__STDC_VERSION__ with it being >=3D 199901 then
the C++ compiler would see "restrict" (no quotes)
after the substitution, likely giving a syntax
error. (It is not a keyword in C++.)

But these types of points also apply to existing
uses of __restrict after cdefs.h use (unless
I missed a level of conditionality that is
relevant). But at least there is some history
as evidence for these.

Overall result: C++ apparently only gets run-time
behavior as evidence for the use of the new
content of select's implementation if this is
changed: no reports of abusive calls as stands.

=3D=3D=3D
Mark Millard
marklmi at yahoo.com
( markmi at dsl-only.net is
going away in 2018-Feb, late)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9438AC5E-56B8-46E4-AECE-5C3A194F4D1E>