[2/3] Consolidate Linux select implementation

Message ID 1492710968-7699-2-git-send-email-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • [1/3] Consolidate Linux poll implementation
Related show

Commit Message

Adhemerval Zanella April 20, 2017, 5:56 p.m.
This patch consolidates the select Linux syscall implementation on
sysdeps/unix/sysv/linux/select.c.  The changes are:

  1. Remove select from auto-generation syscalls.list on the architecture
     that uses __NR_select.
  2. Remove generic implementation add a default one that handle all
     current cases (with the expection of alpha).  The new default
     implementation will either use __NR_select if available of fallback
     to __NR_pselect6 otherwise.
  3. Add a alpha outlier implementation which requires old compatibility
     symbols.

Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
arch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.

	* sysdeps/unix/sysv/linux/alpha/Makefile (sysdep_routines): Add
	osf_select.
	* sysdeps/unix/sysv/linux/alpha/select.c: New file.
	* sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove select and
	osf_select from auto-generation list.
	* sysdeps/unix/sysv/linux/syscalls.list: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.
	* sysdeps/unix/sysv/linux/generic/select.c: Remove file.
	* sysdeps/unix/sysv/linux/select.c: New file.
---
 ChangeLog                                          | 10 ++++
 sysdeps/unix/sysv/linux/alpha/Makefile             |  2 +-
 sysdeps/unix/sysv/linux/alpha/select.c             | 53 ++++++++++++++++++++++
 sysdeps/unix/sysv/linux/alpha/syscalls.list        |  2 -
 sysdeps/unix/sysv/linux/{generic => }/select.c     | 19 ++++++--
 .../unix/sysv/linux/sparc/sparc64/syscalls.list    |  2 -
 sysdeps/unix/sysv/linux/syscalls.list              |  1 -
 7 files changed, 78 insertions(+), 11 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/alpha/select.c
 rename sysdeps/unix/sysv/linux/{generic => }/select.c (82%)

-- 
2.7.4

Comments

Richard Henderson April 22, 2017, 7:35 a.m. | #1
On 04/20/2017 10:56 AM, Adhemerval Zanella wrote:
>   1. Remove select from auto-generation syscalls.list on the architecture

>      that uses __NR_select.

>   2. Remove generic implementation add a default one that handle all

>      current cases (with the expection of alpha).  The new default

>      implementation will either use __NR_select if available of fallback

>      to __NR_pselect6 otherwise.

>   3. Add a alpha outlier implementation which requires old compatibility

>      symbols.


Is there particular value in moving the Alpha version away from syscalls.list?


r~
Luis Javier Merino April 22, 2017, 9:06 a.m. | #2
On Thu, Apr 20, 2017 at 7:56 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:

> diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/select.c

> similarity index 82%

> rename from sysdeps/unix/sysv/linux/generic/select.c

> rename to sysdeps/unix/sysv/linux/select.c

> index 7743ea3..6e03450 100644

> --- a/sysdeps/unix/sysv/linux/generic/select.c

> +++ b/sysdeps/unix/sysv/linux/select.c

> @@ -28,11 +28,19 @@

>     after waiting the interval specified therein.  Returns the number of ready

>     descriptors, or -1 for errors.  */

>

> +#ifdef __NR__newselect

> +# undef __NR_select

> +# define __RN_select __NR__newselect

> +#endif

> +


__RN_select looks like a typo.
Adhemerval Zanella April 22, 2017, 2:43 p.m. | #3
On 22/04/2017 04:35, Richard Henderson wrote:
> On 04/20/2017 10:56 AM, Adhemerval Zanella wrote:

>>   1. Remove select from auto-generation syscalls.list on the architecture

>>      that uses __NR_select.

>>   2. Remove generic implementation add a default one that handle all

>>      current cases (with the expection of alpha).  The new default

>>      implementation will either use __NR_select if available of fallback

>>      to __NR_pselect6 otherwise.

>>   3. Add a alpha outlier implementation which requires old compatibility

>>      symbols.

> 

> Is there particular value in moving the Alpha version away from syscalls.list?

> 

> 

> r~


My goal is get rid of sysdep-cancel.h assembly macro hackery.
Adhemerval Zanella May 2, 2017, 9:10 p.m. | #4
On 20/04/2017 14:56, Adhemerval Zanella wrote:
> This patch consolidates the select Linux syscall implementation on

> sysdeps/unix/sysv/linux/select.c.  The changes are:

> 

>   1. Remove select from auto-generation syscalls.list on the architecture

>      that uses __NR_select.

>   2. Remove generic implementation add a default one that handle all

>      current cases (with the expection of alpha).  The new default

>      implementation will either use __NR_select if available of fallback

>      to __NR_pselect6 otherwise.

>   3. Add a alpha outlier implementation which requires old compatibility

>      symbols.

> 

> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,

> arch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.

> 

> 	* sysdeps/unix/sysv/linux/alpha/Makefile (sysdep_routines): Add

> 	osf_select.

> 	* sysdeps/unix/sysv/linux/alpha/select.c: New file.

> 	* sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove select and

> 	osf_select from auto-generation list.

> 	* sysdeps/unix/sysv/linux/syscalls.list: Likewise.

> 	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.

> 	* sysdeps/unix/sysv/linux/generic/select.c: Remove file.

> 	* sysdeps/unix/sysv/linux/select.c: New file.

> ---

>  ChangeLog                                          | 10 ++++

>  sysdeps/unix/sysv/linux/alpha/Makefile             |  2 +-

>  sysdeps/unix/sysv/linux/alpha/select.c             | 53 ++++++++++++++++++++++

>  sysdeps/unix/sysv/linux/alpha/syscalls.list        |  2 -

>  sysdeps/unix/sysv/linux/{generic => }/select.c     | 19 ++++++--

>  .../unix/sysv/linux/sparc/sparc64/syscalls.list    |  2 -

>  sysdeps/unix/sysv/linux/syscalls.list              |  1 -

>  7 files changed, 78 insertions(+), 11 deletions(-)

>  create mode 100644 sysdeps/unix/sysv/linux/alpha/select.c

>  rename sysdeps/unix/sysv/linux/{generic => }/select.c (82%)

> 

> diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile

> index 37bdd5a..47bd189 100644

> --- a/sysdeps/unix/sysv/linux/alpha/Makefile

> +++ b/sysdeps/unix/sysv/linux/alpha/Makefile

> @@ -13,7 +13,7 @@ sysdep_routines += ieee_get_fp_control ieee_set_fp_control \

>  		   ioperm

>  

>  # Support old timeval32 entry points

> -sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \

> +sysdep_routines += osf_gettimeofday osf_settimeofday \

>  		   osf_getitimer osf_setitimer osf_utimes \

>  		   osf_getrusage osf_wait4

>  

> diff --git a/sysdeps/unix/sysv/linux/alpha/select.c b/sysdeps/unix/sysv/linux/alpha/select.c

> new file mode 100644

> index 0000000..bb0298f

> --- /dev/null

> +++ b/sysdeps/unix/sysv/linux/alpha/select.c

> @@ -0,0 +1,53 @@

> +/* Linux/alpha select implementation.

> +   Copyright (C) 2017 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library is distributed in the hope that it will be useful,

> +   but WITHOUT ANY WARRANTY; without even the implied warranty of

> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <http://www.gnu.org/licenses/>.  */

> +

> +#include <sys/time.h>

> +#include <sys/types.h>

> +#include <sys/select.h>

> +#include <errno.h>

> +#include <sysdep-cancel.h>

> +#include <shlib-compat.h>

> +

> +int

> +__new_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	      struct timeval *timeout)

> +{

> +  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds, timeout);

> +}

> +strong_alias (__new_select, __select)

> +libc_hidden_def (__select)

> +

> +default_symbol_version (__new_select, select, GLIBC_2.1);

> +

> +strong_alias (__new_select, __new_select_private);

> +symbol_version (__new_select_private, __select, GLIBC_2.1);

> +

> +/* Old timeval32 compat calls.  */

> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)

> +int

> +__select_tv32 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	       struct timeval *timeout)

> +{

> +  return SYSCALL_CANCEL (osf_select, nfds, readfds, writefds, exceptfds,

> +                        timeout);

> +}

> +strong_alias (__select_tv32, __select_tv32_1)

> +

> +compat_symbol (libc, __select_tv32, __select, GLIBC_2_0);

> +compat_symbol (libc, __select_tv32_1, select, GLIBC_2_0);

> +#endif

> diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list

> index aa21b10..12cd021 100644

> --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list

> @@ -23,7 +23,6 @@ pciconfig_write	EXTRA	pciconfig_write	5	pciconfig_write

>  pciconfig_iobase EXTRA	pciconfig_iobase 3	__pciconfig_iobase pciconfig_iobase

>  

>  # support old timeval32 entry points

> -osf_select	-	osf_select	C:5	__select_tv32  __select@GLIBC_2.0 select@GLIBC_2.0

>  osf_gettimeofday -	osf_gettimeofday 2	__gettimeofday_tv32  __gettimeofday@GLIBC_2.0 gettimeofday@GLIBC_2.0

>  osf_settimeofday -	osf_settimeofday 2	__settimeofday_tv32  settimeofday@GLIBC_2.0

>  osf_getitimer	-	osf_getitimer	2	__getitimer_tv32  getitimer@GLIBC_2.0

> @@ -33,7 +32,6 @@ osf_getrusage	-	osf_getrusage	2	__getrusage_tv32  getrusage@GLIBC_2.0

>  osf_wait4	-	osf_wait4	4	__wait4_tv32  wait4@GLIBC_2.0

>  

>  # support new timeval64 entry points

> -select		-	select		C:5	__GI___select select@@GLIBC_2.1 __select@@GLIBC_2.1

>  gettimeofday	-	gettimeofday	2	__GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1

>  settimeofday	-	settimeofday	2	__settimeofday settimeofday@@GLIBC_2.1

>  getitimer	-	getitimer	2	__getitimer getitimer@@GLIBC_2.1

> diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/select.c

> similarity index 82%

> rename from sysdeps/unix/sysv/linux/generic/select.c

> rename to sysdeps/unix/sysv/linux/select.c

> index 7743ea3..6e03450 100644

> --- a/sysdeps/unix/sysv/linux/generic/select.c

> +++ b/sysdeps/unix/sysv/linux/select.c

> @@ -1,6 +1,6 @@

> -/* Copyright (C) 2011-2017 Free Software Foundation, Inc.

> +/* Linux select implementation.

> +   Copyright (C) 2017 Free Software Foundation, Inc.

>     This file is part of the GNU C Library.

> -   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.

>  

>     The GNU C Library is free software; you can redistribute it and/or

>     modify it under the terms of the GNU Lesser General Public

> @@ -28,11 +28,19 @@

>     after waiting the interval specified therein.  Returns the number of ready

>     descriptors, or -1 for errors.  */

>  

> +#ifdef __NR__newselect

> +# undef __NR_select

> +# define __RN_select __NR__newselect

> +#endif

> +

>  int

> -__select(int nfds, fd_set *readfds,

> -         fd_set *writefds, fd_set *exceptfds,

> -         struct timeval *timeout)

> +__select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	  struct timeval *timeout)

>  {

> +#ifdef __NR_select

> +  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,

> +			 timeout);

> +#else

>    int result;

>    struct timespec ts, *tsp = NULL;

>  

> @@ -55,6 +63,7 @@ __select(int nfds, fd_set *readfds,

>      }

>  

>    return result;

> +#endif

>  }

>  libc_hidden_def (__select)

>  

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> index 1e85118..33082f3 100644

> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> @@ -1,7 +1,5 @@

>  # File name	Caller	Syscall name	# args	Strong name	Weak names

>  

> -# Override select.S in parent directory:

> -select		-	select		C:5	__select	select

>  bind		-	bind		3	__bind		bind

>  getpeername	-	getpeername	3	__getpeername	getpeername

>  getsockname	-	getsockname	3	__getsockname	getsockname

> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list

> index fcefefc..4d550b8 100644

> --- a/sysdeps/unix/sysv/linux/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/syscalls.list

> @@ -63,7 +63,6 @@ sched_rr_gi	-	sched_rr_get_interval	i:ip	__sched_rr_get_interval	sched_rr_get_in

>  sched_setp	-	sched_setparam	i:ip	__sched_setparam	sched_setparam

>  sched_sets	-	sched_setscheduler	i:iip	__sched_setscheduler	sched_setscheduler

>  sched_yield	-	sched_yield	i:	__sched_yield	sched_yield

> -select		-	_newselect	Ci:iPPPP	__select	__libc_select select

>  sendfile	-	sendfile	i:iipi	sendfile

>  sendfile64	-	sendfile64	i:iipi	sendfile64

>  setfsgid	EXTRA	setfsgid	i:i	setfsgid

> 


Ping.
Siddhesh Poyarekar May 3, 2017, 3:42 a.m. | #5
On Thursday 20 April 2017 11:26 PM, Adhemerval Zanella wrote:
> This patch consolidates the select Linux syscall implementation on

> sysdeps/unix/sysv/linux/select.c.  The changes are:

> 

>   1. Remove select from auto-generation syscalls.list on the architecture

>      that uses __NR_select.

>   2. Remove generic implementation add a default one that handle all

>      current cases (with the expection of alpha).  The new default

>      implementation will either use __NR_select if available of fallback

>      to __NR_pselect6 otherwise.

>   3. Add a alpha outlier implementation which requires old compatibility

>      symbols.

> 

> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,

> arch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.

> 

> 	* sysdeps/unix/sysv/linux/alpha/Makefile (sysdep_routines): Add

> 	osf_select.

> 	* sysdeps/unix/sysv/linux/alpha/select.c: New file.

> 	* sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove select and

> 	osf_select from auto-generation list.

> 	* sysdeps/unix/sysv/linux/syscalls.list: Likewise.

> 	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.

> 	* sysdeps/unix/sysv/linux/generic/select.c: Remove file.

> 	* sysdeps/unix/sysv/linux/select.c: New file.

> ---

>  ChangeLog                                          | 10 ++++

>  sysdeps/unix/sysv/linux/alpha/Makefile             |  2 +-

>  sysdeps/unix/sysv/linux/alpha/select.c             | 53 ++++++++++++++++++++++

>  sysdeps/unix/sysv/linux/alpha/syscalls.list        |  2 -

>  sysdeps/unix/sysv/linux/{generic => }/select.c     | 19 ++++++--

>  .../unix/sysv/linux/sparc/sparc64/syscalls.list    |  2 -

>  sysdeps/unix/sysv/linux/syscalls.list              |  1 -

>  7 files changed, 78 insertions(+), 11 deletions(-)

>  create mode 100644 sysdeps/unix/sysv/linux/alpha/select.c

>  rename sysdeps/unix/sysv/linux/{generic => }/select.c (82%)

> 

> diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile

> index 37bdd5a..47bd189 100644

> --- a/sysdeps/unix/sysv/linux/alpha/Makefile

> +++ b/sysdeps/unix/sysv/linux/alpha/Makefile

> @@ -13,7 +13,7 @@ sysdep_routines += ieee_get_fp_control ieee_set_fp_control \

>  		   ioperm

>  

>  # Support old timeval32 entry points

> -sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \

> +sysdep_routines += osf_gettimeofday osf_settimeofday \

>  		   osf_getitimer osf_setitimer osf_utimes \

>  		   osf_getrusage osf_wait4

>  

> diff --git a/sysdeps/unix/sysv/linux/alpha/select.c b/sysdeps/unix/sysv/linux/alpha/select.c

> new file mode 100644

> index 0000000..bb0298f

> --- /dev/null

> +++ b/sysdeps/unix/sysv/linux/alpha/select.c

> @@ -0,0 +1,53 @@

> +/* Linux/alpha select implementation.

> +   Copyright (C) 2017 Free Software Foundation, Inc.

> +   This file is part of the GNU C Library.

> +

> +   The GNU C Library is free software; you can redistribute it and/or

> +   modify it under the terms of the GNU Lesser General Public

> +   License as published by the Free Software Foundation; either

> +   version 2.1 of the License, or (at your option) any later version.

> +

> +   The GNU C Library is distributed in the hope that it will be useful,

> +   but WITHOUT ANY WARRANTY; without even the implied warranty of

> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

> +   Lesser General Public License for more details.

> +

> +   You should have received a copy of the GNU Lesser General Public

> +   License along with the GNU C Library.  If not, see

> +   <http://www.gnu.org/licenses/>.  */

> +

> +#include <sys/time.h>

> +#include <sys/types.h>

> +#include <sys/select.h>

> +#include <errno.h>

> +#include <sysdep-cancel.h>

> +#include <shlib-compat.h>

> +

> +int

> +__new_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	      struct timeval *timeout)

> +{

> +  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds, timeout);

> +}

> +strong_alias (__new_select, __select)

> +libc_hidden_def (__select)

> +

> +default_symbol_version (__new_select, select, GLIBC_2.1);

> +

> +strong_alias (__new_select, __new_select_private);

> +symbol_version (__new_select_private, __select, GLIBC_2.1);

> +

> +/* Old timeval32 compat calls.  */

> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)

> +int

> +__select_tv32 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	       struct timeval *timeout)

> +{

> +  return SYSCALL_CANCEL (osf_select, nfds, readfds, writefds, exceptfds,

> +                        timeout);

> +}

> +strong_alias (__select_tv32, __select_tv32_1)

> +

> +compat_symbol (libc, __select_tv32, __select, GLIBC_2_0);

> +compat_symbol (libc, __select_tv32_1, select, GLIBC_2_0);

> +#endif

> diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list

> index aa21b10..12cd021 100644

> --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list

> @@ -23,7 +23,6 @@ pciconfig_write	EXTRA	pciconfig_write	5	pciconfig_write

>  pciconfig_iobase EXTRA	pciconfig_iobase 3	__pciconfig_iobase pciconfig_iobase

>  

>  # support old timeval32 entry points

> -osf_select	-	osf_select	C:5	__select_tv32  __select@GLIBC_2.0 select@GLIBC_2.0

>  osf_gettimeofday -	osf_gettimeofday 2	__gettimeofday_tv32  __gettimeofday@GLIBC_2.0 gettimeofday@GLIBC_2.0

>  osf_settimeofday -	osf_settimeofday 2	__settimeofday_tv32  settimeofday@GLIBC_2.0

>  osf_getitimer	-	osf_getitimer	2	__getitimer_tv32  getitimer@GLIBC_2.0

> @@ -33,7 +32,6 @@ osf_getrusage	-	osf_getrusage	2	__getrusage_tv32  getrusage@GLIBC_2.0

>  osf_wait4	-	osf_wait4	4	__wait4_tv32  wait4@GLIBC_2.0

>  

>  # support new timeval64 entry points

> -select		-	select		C:5	__GI___select select@@GLIBC_2.1 __select@@GLIBC_2.1

>  gettimeofday	-	gettimeofday	2	__GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1

>  settimeofday	-	settimeofday	2	__settimeofday settimeofday@@GLIBC_2.1

>  getitimer	-	getitimer	2	__getitimer getitimer@@GLIBC_2.1

> diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/select.c

> similarity index 82%

> rename from sysdeps/unix/sysv/linux/generic/select.c

> rename to sysdeps/unix/sysv/linux/select.c

> index 7743ea3..6e03450 100644

> --- a/sysdeps/unix/sysv/linux/generic/select.c

> +++ b/sysdeps/unix/sysv/linux/select.c

> @@ -1,6 +1,6 @@

> -/* Copyright (C) 2011-2017 Free Software Foundation, Inc.

> +/* Linux select implementation.

> +   Copyright (C) 2017 Free Software Foundation, Inc.

>     This file is part of the GNU C Library.

> -   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.

>  

>     The GNU C Library is free software; you can redistribute it and/or

>     modify it under the terms of the GNU Lesser General Public

> @@ -28,11 +28,19 @@

>     after waiting the interval specified therein.  Returns the number of ready

>     descriptors, or -1 for errors.  */

>  

> +#ifdef __NR__newselect

> +# undef __NR_select

> +# define __RN_select __NR__newselect


Typo.

Looks OK otherwise.

Siddhesh

> +#endif

> +

>  int

> -__select(int nfds, fd_set *readfds,

> -         fd_set *writefds, fd_set *exceptfds,

> -         struct timeval *timeout)

> +__select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

> +	  struct timeval *timeout)

>  {

> +#ifdef __NR_select

> +  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,

> +			 timeout);

> +#else

>    int result;

>    struct timespec ts, *tsp = NULL;

>  

> @@ -55,6 +63,7 @@ __select(int nfds, fd_set *readfds,

>      }

>  

>    return result;

> +#endif

>  }

>  libc_hidden_def (__select)

>  

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> index 1e85118..33082f3 100644

> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list

> @@ -1,7 +1,5 @@

>  # File name	Caller	Syscall name	# args	Strong name	Weak names

>  

> -# Override select.S in parent directory:

> -select		-	select		C:5	__select	select

>  bind		-	bind		3	__bind		bind

>  getpeername	-	getpeername	3	__getpeername	getpeername

>  getsockname	-	getsockname	3	__getsockname	getsockname

> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list

> index fcefefc..4d550b8 100644

> --- a/sysdeps/unix/sysv/linux/syscalls.list

> +++ b/sysdeps/unix/sysv/linux/syscalls.list

> @@ -63,7 +63,6 @@ sched_rr_gi	-	sched_rr_get_interval	i:ip	__sched_rr_get_interval	sched_rr_get_in

>  sched_setp	-	sched_setparam	i:ip	__sched_setparam	sched_setparam

>  sched_sets	-	sched_setscheduler	i:iip	__sched_setscheduler	sched_setscheduler

>  sched_yield	-	sched_yield	i:	__sched_yield	sched_yield

> -select		-	_newselect	Ci:iPPPP	__select	__libc_select select

>  sendfile	-	sendfile	i:iipi	sendfile

>  sendfile64	-	sendfile64	i:iipi	sendfile64

>  setfsgid	EXTRA	setfsgid	i:i	setfsgid

>

Patch hide | download patch | download mbox

diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index 37bdd5a..47bd189 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -13,7 +13,7 @@  sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
 		   ioperm
 
 # Support old timeval32 entry points
-sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \
+sysdep_routines += osf_gettimeofday osf_settimeofday \
 		   osf_getitimer osf_setitimer osf_utimes \
 		   osf_getrusage osf_wait4
 
diff --git a/sysdeps/unix/sysv/linux/alpha/select.c b/sysdeps/unix/sysv/linux/alpha/select.c
new file mode 100644
index 0000000..bb0298f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/select.c
@@ -0,0 +1,53 @@ 
+/* Linux/alpha select implementation.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <errno.h>
+#include <sysdep-cancel.h>
+#include <shlib-compat.h>
+
+int
+__new_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+	      struct timeval *timeout)
+{
+  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds, timeout);
+}
+strong_alias (__new_select, __select)
+libc_hidden_def (__select)
+
+default_symbol_version (__new_select, select, GLIBC_2.1);
+
+strong_alias (__new_select, __new_select_private);
+symbol_version (__new_select_private, __select, GLIBC_2.1);
+
+/* Old timeval32 compat calls.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
+int
+__select_tv32 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+	       struct timeval *timeout)
+{
+  return SYSCALL_CANCEL (osf_select, nfds, readfds, writefds, exceptfds,
+                        timeout);
+}
+strong_alias (__select_tv32, __select_tv32_1)
+
+compat_symbol (libc, __select_tv32, __select, GLIBC_2_0);
+compat_symbol (libc, __select_tv32_1, select, GLIBC_2_0);
+#endif
diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
index aa21b10..12cd021 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
+++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
@@ -23,7 +23,6 @@  pciconfig_write	EXTRA	pciconfig_write	5	pciconfig_write
 pciconfig_iobase EXTRA	pciconfig_iobase 3	__pciconfig_iobase pciconfig_iobase
 
 # support old timeval32 entry points
-osf_select	-	osf_select	C:5	__select_tv32  __select@GLIBC_2.0 select@GLIBC_2.0
 osf_gettimeofday -	osf_gettimeofday 2	__gettimeofday_tv32  __gettimeofday@GLIBC_2.0 gettimeofday@GLIBC_2.0
 osf_settimeofday -	osf_settimeofday 2	__settimeofday_tv32  settimeofday@GLIBC_2.0
 osf_getitimer	-	osf_getitimer	2	__getitimer_tv32  getitimer@GLIBC_2.0
@@ -33,7 +32,6 @@  osf_getrusage	-	osf_getrusage	2	__getrusage_tv32  getrusage@GLIBC_2.0
 osf_wait4	-	osf_wait4	4	__wait4_tv32  wait4@GLIBC_2.0
 
 # support new timeval64 entry points
-select		-	select		C:5	__GI___select select@@GLIBC_2.1 __select@@GLIBC_2.1
 gettimeofday	-	gettimeofday	2	__GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1
 settimeofday	-	settimeofday	2	__settimeofday settimeofday@@GLIBC_2.1
 getitimer	-	getitimer	2	__getitimer getitimer@@GLIBC_2.1
diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/select.c
similarity index 82%
rename from sysdeps/unix/sysv/linux/generic/select.c
rename to sysdeps/unix/sysv/linux/select.c
index 7743ea3..6e03450 100644
--- a/sysdeps/unix/sysv/linux/generic/select.c
+++ b/sysdeps/unix/sysv/linux/select.c
@@ -1,6 +1,6 @@ 
-/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
+/* Linux select implementation.
+   Copyright (C) 2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -28,11 +28,19 @@ 
    after waiting the interval specified therein.  Returns the number of ready
    descriptors, or -1 for errors.  */
 
+#ifdef __NR__newselect
+# undef __NR_select
+# define __RN_select __NR__newselect
+#endif
+
 int
-__select(int nfds, fd_set *readfds,
-         fd_set *writefds, fd_set *exceptfds,
-         struct timeval *timeout)
+__select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+	  struct timeval *timeout)
 {
+#ifdef __NR_select
+  return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,
+			 timeout);
+#else
   int result;
   struct timespec ts, *tsp = NULL;
 
@@ -55,6 +63,7 @@  __select(int nfds, fd_set *readfds,
     }
 
   return result;
+#endif
 }
 libc_hidden_def (__select)
 
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
index 1e85118..33082f3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
@@ -1,7 +1,5 @@ 
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
-# Override select.S in parent directory:
-select		-	select		C:5	__select	select
 bind		-	bind		3	__bind		bind
 getpeername	-	getpeername	3	__getpeername	getpeername
 getsockname	-	getsockname	3	__getsockname	getsockname
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index fcefefc..4d550b8 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -63,7 +63,6 @@  sched_rr_gi	-	sched_rr_get_interval	i:ip	__sched_rr_get_interval	sched_rr_get_in
 sched_setp	-	sched_setparam	i:ip	__sched_setparam	sched_setparam
 sched_sets	-	sched_setscheduler	i:iip	__sched_setscheduler	sched_setscheduler
 sched_yield	-	sched_yield	i:	__sched_yield	sched_yield
-select		-	_newselect	Ci:iPPPP	__select	__libc_select select
 sendfile	-	sendfile	i:iipi	sendfile
 sendfile64	-	sendfile64	i:iipi	sendfile64
 setfsgid	EXTRA	setfsgid	i:i	setfsgid