]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Consolidate Linux semctl implementation
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 26 Oct 2016 18:55:39 +0000 (16:55 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 28 Dec 2016 22:31:04 +0000 (20:31 -0200)
This patch consolidates the semctl Linux implementation in only
one default file, sysdeps/unix/sysv/linux/semctl.c.  If tries to use
the direct syscall if it is supported, otherwise will use the old ipc
multiplex mechanism.

The patch also simplify header inclusion and reorganize internal
compat symbol to be built only if old ipc is defined.

Checked on x86_64, i686, powerpc64le, aarch64, and armhf.

* sysdeps/unix/sysv/linux/alpha/Makefile (sysdeps_routines): Remove
oldsemctl.
* sysdeps/unix/sysv/linux/alpha/semctl.c: Remove file.
* sysdeps/unix/sysv/linux/arm/semctl.c: Likewise.
* sysdeps/unix/sysv/linux/microblaze/semctl.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/semctl.c: Use defaulf
implementation.
* sysdeps/unix/sysv/linux/semctl.c (__new_semctl): Use semctl
syscall if it is defined.
* sysdeps/unix/sysv/linux/generic/syscalls.list (semctl): Remove.
* sysdeps/unix/sysv/linux/alpha/syscalls.list (semctl): Likewise.
* sysdeps/unix/sysv/linux/hppa/syscalls.list (semctl): Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list (semctl): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (semctl):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (semctl): Likewise.

14 files changed:
ChangeLog
sysdeps/unix/sysv/linux/alpha/Makefile
sysdeps/unix/sysv/linux/alpha/semctl.c [deleted file]
sysdeps/unix/sysv/linux/alpha/syscalls.list
sysdeps/unix/sysv/linux/arm/semctl.c [deleted file]
sysdeps/unix/sysv/linux/generic/syscalls.list
sysdeps/unix/sysv/linux/hppa/syscalls.list
sysdeps/unix/sysv/linux/ia64/syscalls.list
sysdeps/unix/sysv/linux/microblaze/semctl.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips64/semctl.c
sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
sysdeps/unix/sysv/linux/semctl.c
sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c [deleted file]
sysdeps/unix/sysv/linux/x86_64/syscalls.list

index eb7e75129e0ccbc16d7f7850beec34617ba109e2..b9e40cc12d910ca9997dc9e132ae5a008903cfa7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2016-12-28  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * sysdeps/unix/sysv/linux/alpha/Makefile (sysdeps_routines): Remove
+       oldsemctl.
+       * sysdeps/unix/sysv/linux/alpha/semctl.c: Remove file.
+       * sysdeps/unix/sysv/linux/arm/semctl.c: Likewise.
+       * sysdeps/unix/sysv/linux/microblaze/semctl.c: Likewise.
+       * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise.
+       * sysdeps/unix/sysv/linux/mips/mips64/semctl.c: Use defaulf
+       implementation.
+       * sysdeps/unix/sysv/linux/semctl.c (__new_semctl): Use semctl
+       syscall if it is defined.
+       * sysdeps/unix/sysv/linux/generic/syscalls.list (semctl): Remove.
+       * sysdeps/unix/sysv/linux/alpha/syscalls.list (semctl): Likewise.
+       * sysdeps/unix/sysv/linux/hppa/syscalls.list (semctl): Likewise.
+       * sysdeps/unix/sysv/linux/ia64/syscalls.list (semctl): Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (semctl):
+       Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/syscalls.list (semctl): Likewise.
+
        * sysvipc/Makefile (tests): Add test-sysvmsg.
        * sysvipc/test-sysvmsg.c: New file.
        * support/check.h (FAIL_UNSUPPORTED): New define.
index c24dc2e900dac117a81ce52b27384b476fa27d24..386b3fdd38f024bbe0638a2f221138071623c1db 100644 (file)
@@ -18,7 +18,7 @@ sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \
                   osf_getrusage osf_wait4
 
 # Support old ipc control
-sysdep_routines += oldsemctl oldshmctl
+sysdep_routines += oldshmctl
 
 CFLAGS-ioperm.c = -Wa,-mev6
 endif
diff --git a/sysdeps/unix/sysv/linux/alpha/semctl.c b/sysdeps/unix/sysv/linux/alpha/semctl.c
deleted file mode 100644 (file)
index 4cb834a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/semctl.c>
index 54c175252292f2f3def4d704e3db06331bfbe90a..c12620a382633e132db0f2593fb936b0d4bb3931 100644 (file)
@@ -7,7 +7,6 @@ shmget          -       shmget          i:iii   __shmget        shmget
 semop          -       semop           i:ipi   __semop         semop
 semtimedop     -       semtimedop      i:ipip  semtimedop
 semget         -       semget          i:iii   __semget        semget
-oldsemctl      EXTRA   semctl          i:iiii  __old_semctl    semctl@GLIBC_2.0
 
 sigstack       -       sigstack        2       sigstack
 
diff --git a/sysdeps/unix/sysv/linux/arm/semctl.c b/sysdeps/unix/sysv/linux/arm/semctl.c
deleted file mode 100644 (file)
index 79d9d3e..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
-
-   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 <errno.h>
-#include <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;                     /* value for SETVAL */
-  struct semid_ds *buf;                /* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;   /* array for GETALL & SETALL */
-  struct seminfo *__buf;       /* buffer for IPC_INFO */
-};
-
-int
-__new_semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
-
-  va_end (ap);
-
-  return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
-                        arg.array);
-}
-
-#include <shlib-compat.h>
-versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
index ad752238845f26fa109ccfca4b031b631270431f..f95f1f7a490335b675b7f970339880c9fa3a344b 100644 (file)
@@ -2,7 +2,6 @@
 
 # SysV APIs
 semget         -       semget          i:iii   __semget        semget
-semctl         -       semctl          i:iiii  __semctl        semctl
 semtimedop     -       semtimedop      i:ipip  semtimedop
 semop          -       semop           i:ipi   __semop         semop
 shmget         -       shmget          i:iii   __shmget        shmget
index da2c9abbbf0f824f5f08735f74e6eabd20e7ffa6..5040ef34ecb0ae9b622c027b6ead4fa982f5e06d 100644 (file)
@@ -8,7 +8,6 @@ shmget          -       shmget          i:iii   __shmget        shmget
 semop          -       semop           i:ipi   __semop         semop
 semtimedop      -       semtimedop      i:ipip  semtimedop
 semget         -       semget          i:iii   __semget        semget
-semctl         -       semctl          i:iiii  __semctl        semctl
 
 # proper socket implementations:
 accept         -       accept          Ci:iBN  __libc_accept   __accept accept
index 8056781e41bad7710354e7dafee9225cdabdd206..ca5cba46f86a59911ac5b9028ab00b6705c9947b 100644 (file)
@@ -12,7 +12,6 @@ shmget                -       shmget          i:iii   __shmget        shmget
 semop          -       semop           i:ipi   __semop         semop
 semtimedop     -       semtimedop      i:ipip  semtimedop
 semget         -       semget          i:iii   __semget        semget
-semctl         -       semctl          i:iiii  __semctl        semctl
 
 # proper socket implementations:
 accept         -       accept          Ci:iBN  __libc_accept   __accept accept
diff --git a/sysdeps/unix/sysv/linux/microblaze/semctl.c b/sysdeps/unix/sysv/linux/microblaze/semctl.c
deleted file mode 100644 (file)
index 4cb834a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/arm/semctl.c>
index 1115a25a51ca4b068bd75333a8e240d62319f782..5a0c2a3dd375d49f181597c7a7f4b52219f646eb 100644 (file)
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-#include <sysdep.h>
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;                     /* value for SETVAL */
-  struct semid_ds *buf;                /* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;   /* array for GETALL & SETALL */
-  struct seminfo *__buf;       /* buffer for IPC_INFO */
-};
-
-int __semctl (int semid, int semnum, int cmd, ...);
-
-int
-__semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
+#include <shlib-compat.h>
 
-  va_end (ap);
+#undef SHLIB_COMPAT
+#define SHLIB_COMPAT(a, b, c) 0
 
-  return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
-                        arg.array);
-}
+#define DEFAULT_VERSION GLIBC_2_0
 
-#include <shlib-compat.h>
-versioned_symbol (libc, __semctl, semctl, GLIBC_2_0);
+#include <sysdeps/unix/sysv/linux/semctl.c>
index f23b3798b4e9a47299a02f56eb318d5d7430afed..09ab5805048bacfd6d84ffd6ff61a493054b7141 100644 (file)
@@ -7,4 +7,3 @@ shmdt           -       shmdt           i:s     __shmdt         shmdt
 shmget         -       shmget          i:iii   __shmget        shmget
 semop          -       semop           i:ipi   __semop         semop
 semget         -       semget          i:iii   __semget        semget
-semctl         -       semctl          i:iiii  __semctl        semctl
index ee84a1e31601e3f8f82f66f8874b8775279702c5..dde224105bb14c87c757c91fc40b3310bbb4e9e6 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stdarg.h>
 #include <sys/sem.h>
+#include <stdarg.h>
 #include <ipc_priv.h>
-
 #include <sysdep.h>
-#include <string.h>
-#include <sys/syscall.h>
 #include <shlib-compat.h>
-
-#include <kernel-features.h>
-
-struct __old_semid_ds
-{
-  struct __old_ipc_perm sem_perm;      /* operation permission struct */
-  __time_t sem_otime;                  /* last semop() time */
-  __time_t sem_ctime;                  /* last time changed by semctl() */
-  struct sem *__sembase;               /* ptr to first semaphore in array */
-  struct sem_queue *__sem_pending;     /* pending operations */
-  struct sem_queue *__sem_pending_last; /* last pending operation */
-  struct sem_undo *__undo;             /* ondo requests on this array */
-  unsigned short int sem_nsems;                /* number of semaphores in set */
-};
+#include <errno.h>
 
 /* Define a `union semun' suitable for Linux here.  */
 union semun
@@ -47,26 +30,19 @@ union semun
   struct semid_ds *buf;                /* buffer for IPC_STAT & IPC_SET */
   unsigned short int *array;   /* array for GETALL & SETALL */
   struct seminfo *__buf;       /* buffer for IPC_INFO */
-  struct __old_semid_ds *__old_buf;
 };
 
-/* Return identifier for array of NSEMS semaphores associated with
-   KEY.  */
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
-int __old_semctl (int semid, int semnum, int cmd, ...);
+#ifndef DEFAULT_VERSION
+# define DEFAULT_VERSION GLIBC_2_2
 #endif
-int __new_semctl (int semid, int semnum, int cmd, ...);
 
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
-attribute_compat_text_section
-__old_semctl (int semid, int semnum, int cmd, ...)
+__new_semctl (int semid, int semnum, int cmd, ...)
 {
-  union semun arg;
+  union semun arg = { 0 };
   va_list ap;
 
   /* Get the argument only if required.  */
-  arg.buf = NULL;
   switch (cmd)
     {
     case SETVAL:        /* arg.val */
@@ -83,20 +59,29 @@ __old_semctl (int semid, int semnum, int cmd, ...)
       break;
     }
 
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
-                        &arg);
-}
-compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd | __IPC_64,
+                             arg.array);
+#else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
+                             SEMCTL_ARG_ADDRESS (arg));
 #endif
+}
+versioned_symbol (libc, __new_semctl, semctl, DEFAULT_VERSION);
+
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
+/* Since semctl use a variadic argument for semid_ds there is not need to
+   define and tie the compatibility symbol to the old 'union semun'
+   definition.  */
 int
-__new_semctl (int semid, int semnum, int cmd, ...)
+attribute_compat_text_section
+__old_semctl (int semid, int semnum, int cmd, ...)
 {
-  union semun arg;
+  union semun arg = { 0 };
   va_list ap;
 
   /* Get the argument only if required.  */
-  arg.buf = NULL;
   switch (cmd)
     {
     case SETVAL:        /* arg.val */
@@ -113,8 +98,12 @@ __new_semctl (int semid, int semnum, int cmd, ...)
       break;
     }
 
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
-                        &arg);
+# ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array);
+# else
+  return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd,
+                             SEMCTL_ARG_ADDRESS (arg));
+# endif
 }
-
-versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
+compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c b/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c
deleted file mode 100644 (file)
index a9ae4c6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
-
-   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 <errno.h>
-#include <stdarg.h>
-#include <sys/sem.h>
-#include <ipc_priv.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-/* Define a `union semun' suitable for Linux here.  */
-union semun
-{
-  int val;                     /* value for SETVAL */
-  struct semid_ds *buf;                /* buffer for IPC_STAT & IPC_SET */
-  unsigned short int *array;   /* array for GETALL & SETALL */
-  struct seminfo *__buf;       /* buffer for IPC_INFO */
-};
-
-/* Return identifier for array of NSEMS semaphores associated with
-   KEY.  */
-
-int
-semctl (int semid, int semnum, int cmd, ...)
-{
-  union semun arg;
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  /* Get the argument.  */
-  arg = va_arg (ap, union semun);
-
-  va_end (ap);
-
-  return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
-                        arg.array);
-}
index 75b25a1b33cfe87b13a54170ba12b58164ae779a..f3a15416a47b87e10d7473183e3138f3212bc7cb 100644 (file)
@@ -13,7 +13,6 @@ shmget                -       shmget          i:iii   __shmget        shmget
 semop          -       semop           i:ipi   __semop         semop
 semtimedop     -       semtimedop      i:ipip  semtimedop
 semget         -       semget          i:iii   __semget        semget
-semctl         -       semctl          i:iiii  __semctl        semctl
 syscall_clock_gettime  EXTRA   clock_gettime   Ei:ip           __syscall_clock_gettime