Consolidate Linux semctl implementation
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.
This commit is contained in:
parent
59c900c54b
commit
40c0a78068
18
ChangeLog
18
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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
#include <sysdeps/unix/sysv/linux/arm/semctl.c>
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
#include <sysdeps/unix/sysv/linux/arm/semctl.c>
|
|
@ -15,39 +15,11 @@
|
|||
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);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return INLINE_SYSCALL (semctl, 4, semid, semnum, cmd | __IPC_64,
|
||||
arg.array);
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
versioned_symbol (libc, __semctl, semctl, GLIBC_2_0);
|
||||
|
||||
#undef SHLIB_COMPAT
|
||||
#define SHLIB_COMPAT(a, b, c) 0
|
||||
|
||||
#define DEFAULT_VERSION GLIBC_2_0
|
||||
|
||||
#include <sysdeps/unix/sysv/linux/semctl.c>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -16,29 +16,12 @@
|
|||
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,56 +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, ...);
|
||||
#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, ...)
|
||||
{
|
||||
union semun arg;
|
||||
va_list ap;
|
||||
|
||||
/* Get the argument only if required. */
|
||||
arg.buf = NULL;
|
||||
switch (cmd)
|
||||
{
|
||||
case SETVAL: /* arg.val */
|
||||
case GETALL: /* arg.array */
|
||||
case SETALL:
|
||||
case IPC_STAT: /* arg.buf */
|
||||
case IPC_SET:
|
||||
case SEM_STAT:
|
||||
case IPC_INFO: /* arg.__buf */
|
||||
case SEM_INFO:
|
||||
va_start (ap, cmd);
|
||||
arg = va_arg (ap, union semun);
|
||||
va_end (ap);
|
||||
break;
|
||||
}
|
||||
|
||||
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
|
||||
&arg);
|
||||
}
|
||||
compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
|
||||
#ifndef DEFAULT_VERSION
|
||||
# define DEFAULT_VERSION GLIBC_2_2
|
||||
#endif
|
||||
|
||||
int
|
||||
__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 */
|
||||
|
@ -113,8 +59,51 @@ __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 | __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);
|
||||
|
||||
versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
|
||||
|
||||
#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
|
||||
attribute_compat_text_section
|
||||
__old_semctl (int semid, int semnum, int cmd, ...)
|
||||
{
|
||||
union semun arg = { 0 };
|
||||
va_list ap;
|
||||
|
||||
/* Get the argument only if required. */
|
||||
switch (cmd)
|
||||
{
|
||||
case SETVAL: /* arg.val */
|
||||
case GETALL: /* arg.array */
|
||||
case SETALL:
|
||||
case IPC_STAT: /* arg.buf */
|
||||
case IPC_SET:
|
||||
case SEM_STAT:
|
||||
case IPC_INFO: /* arg.__buf */
|
||||
case SEM_INFO:
|
||||
va_start (ap, cmd);
|
||||
arg = va_arg (ap, union semun);
|
||||
va_end (ap);
|
||||
break;
|
||||
}
|
||||
|
||||
# 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
|
||||
}
|
||||
compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
|
||||
#endif
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue