]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Consolidate Linux select implementation
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 18 Nov 2016 16:27:03 +0000 (14:27 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 3 May 2017 13:36:36 +0000 (10:36 -0300)
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
sysdeps/unix/sysv/linux/alpha/Makefile
sysdeps/unix/sysv/linux/alpha/select.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/alpha/syscalls.list
sysdeps/unix/sysv/linux/select.c [moved from sysdeps/unix/sysv/linux/generic/select.c with 82% similarity]
sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
sysdeps/unix/sysv/linux/syscalls.list

index 3aadc27b59795dceab9c9019d05072dd0626fd16..a48b9fb7d91b28e65567dc500d41b32e84d1edfa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2016-04-03  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * 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.
+
        * sysdeps/unix/sysv/linux/generic/poll.c: Remove file.
        * sysdeps/unix/sysv/linux/poll.c: New file.
        * sysdeps/unix/sysv/linux/syscalls.list: Remove poll from
index 37bdd5a3d0507392237c7163a71e73756e80b928..47bd189f943f3762ca06fe7c01fa2bd43b982aed 100644 (file)
@@ -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 (file)
index 0000000..bb0298f
--- /dev/null
@@ -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
index aa21b10a25a010c9dc457e6dc2e2dcf6bacb48b0..12cd021b60f454e50c1ec8e59b2da10961c2a239 100644 (file)
@@ -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
similarity index 82%
rename from sysdeps/unix/sysv/linux/generic/select.c
rename to sysdeps/unix/sysv/linux/select.c
index 7743ea3f3aa53c726b4833d3bf2b286e79d3679d..be4a456a51358e2aa8e25e27e528aad111fbbe34 100644 (file)
@@ -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
    after waiting the interval specified therein.  Returns the number of ready
    descriptors, or -1 for errors.  */
 
+#ifdef __NR__newselect
+# undef __NR_select
+# define __NR_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)
 
index 1e85118e361bc180c392a0b95ad55a6769d0574d..33082f31eb28e721e0853ddc82530c28ff475102 100644 (file)
@@ -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
index fcefefcad2b188fbf2367d351c6d3bbba108272e..4d550b8804e49e19934ea665ab3f46ae65efdc25 100644 (file)
@@ -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