From patchwork Tue Nov 1 14:25:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 80355 Delivered-To: patch@linaro.org Received: by 10.80.142.83 with SMTP id 19csp677618edx; Tue, 1 Nov 2016 07:26:09 -0700 (PDT) X-Received: by 10.98.60.7 with SMTP id j7mr29494149pfa.129.1478010369426; Tue, 01 Nov 2016 07:26:09 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id r9si4318972pfi.84.2016.11.01.07.26.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Nov 2016 07:26:09 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-74258-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-74258-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-74258-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=lXCCoBY+ET6q9C2Rzl03msDTn309Jsm 5bCWPCid0nkRoURdySbnMxKZ+HgumVIfBs0sMEB/8JvI6ssxC7JuY3JlAIac1q6V u+irwXLAyrCYtxGxhueB+MOQWtTcGo8CIlcmTPgaA1AGxIMekYkAbcowV9qtQZzo ww7wRwLWSQK0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=RVR+TIYOhWMrGXBaHelnepNzbrE=; b=boZpr H4Vlx0wEthg50X9Wx+aUqkgzjMw5KQlVT3Z9zg8oYLmZ1hCn32N1o47vyLuPbq5d x60C0hrT3hcmtl8EieDtMhL70+pXau3YzvXjshI3CLQTvv7Gt09I9A1WjD7zjaY0 9tLjha3Kgmmrj6GP6bIRiDvncs0PBBazNHd5vI= Received: (qmail 36456 invoked by alias); 1 Nov 2016 14:25:44 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 36349 invoked by uid 89); 1 Nov 2016 14:25:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=19952016, 1995-2016, KEY, drepper X-HELO: mail-ua0-f171.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=76aU9qyiyL5aXOFKkAZ79uUVEe+ed4dpDgAq61bFrQM=; b=DSF3wKe0P7SOyjGyx0GImtJJOwOoB0QGPJ1+MsctURPLMC+4UQv5bq2p5tyhiJ+1Tn mNF2P3rvaRz/a2CuFh6KlNL70neCTvD9UoZ4oBkcAiQysoA7q+oS4y/yU9zN2CGfvl+h PDFi3ZZhWbpQ/fx3wqDos8I2czznUVIc9E0RVZbAcTU8H8+KuR53noBu8W5RW37U7zLv sAtuPmDD+CeVVdJzOEK/PTc65j8brlN5A+W+59jR5SbkNpveIC2ckpnClJYln2xRsgoy GONo5uj0xh5a38GZ9+J/xwYwQqP4KYhp9eMo0GaXdVwWG07nHwr5WfkYmbKVshwF673m +ZVw== X-Gm-Message-State: ABUngvdSjaiq7hIwpgqgIpCQs45iRyef/yHJ3BA4APXFEi0GQKJIfpImKbq3GHkEzwHyCtMm X-Received: by 10.176.81.245 with SMTP id h50mr9484258uaa.1.1478010337697; Tue, 01 Nov 2016 07:25:37 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 06/15] Consolidate Linux semctl implementation Date: Tue, 1 Nov 2016 12:25:14 -0200 Message-Id: <1478010323-13076-7-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1478010323-13076-1-git-send-email-adhemerval.zanella@linaro.org> References: <1478010323-13076-1-git-send-email-adhemerval.zanella@linaro.org> 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 defined, 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/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. --- ChangeLog | 9 +++++ sysdeps/unix/sysv/linux/alpha/semctl.c | 1 - sysdeps/unix/sysv/linux/arm/semctl.c | 54 -------------------------- sysdeps/unix/sysv/linux/microblaze/semctl.c | 1 - sysdeps/unix/sysv/linux/mips/mips64/semctl.c | 38 +----------------- sysdeps/unix/sysv/linux/semctl.c | 54 +++++++++++++------------- sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c | 54 -------------------------- 7 files changed, 37 insertions(+), 174 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/alpha/semctl.c delete mode 100644 sysdeps/unix/sysv/linux/arm/semctl.c delete mode 100644 sysdeps/unix/sysv/linux/microblaze/semctl.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/alpha/semctl.c b/sysdeps/unix/sysv/linux/alpha/semctl.c deleted file mode 100644 index 4cb834a..0000000 --- a/sysdeps/unix/sysv/linux/alpha/semctl.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/arm/semctl.c b/sysdeps/unix/sysv/linux/arm/semctl.c deleted file mode 100644 index 79d9d3e..0000000 --- a/sysdeps/unix/sysv/linux/arm/semctl.c +++ /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 , 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 - . */ - -#include -#include -#include -#include -#include -#include - - -/* 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 -versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2); diff --git a/sysdeps/unix/sysv/linux/microblaze/semctl.c b/sysdeps/unix/sysv/linux/microblaze/semctl.c deleted file mode 100644 index 4cb834a..0000000 --- a/sysdeps/unix/sysv/linux/microblaze/semctl.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/mips/mips64/semctl.c b/sysdeps/unix/sysv/linux/mips/mips64/semctl.c index 1115a25..61ba985 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/semctl.c +++ b/sysdeps/unix/sysv/linux/mips/mips64/semctl.c @@ -15,39 +15,5 @@ License along with the GNU C Library. If not, see . */ -#include -#include -#include -#include -#include - -/* 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 -versioned_symbol (libc, __semctl, semctl, GLIBC_2_0); +#define DEFAULT_VERSION GLIBC_2_0 +#include diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c index ee84a1e..c170681 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -16,18 +16,14 @@ License along with the GNU C Library; if not, see . */ -#include -#include #include +#include #include - #include -#include -#include #include +#include -#include - +/* Old semid_ds definition. */ struct __old_semid_ds { struct __old_ipc_perm sem_perm; /* operation permission struct */ @@ -50,23 +46,17 @@ union semun 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 +73,28 @@ __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 __NR_semctl + return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array); +#else + return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64, + &arg); #endif +} +versioned_symbol (libc, __new_semctl, semctl, DEFAULT_VERSION); + + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) \ + && defined (__NR_ipc) +int __old_semctl (int semid, int semnum, int cmd, ...); 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 +111,8 @@ __new_semctl (int semid, int semnum, int cmd, ...) break; } - return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64, - &arg); + return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd, + &arg); } - -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 index a9ae4c6..0000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c +++ /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 , 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 - . */ - -#include -#include -#include -#include - -#include -#include - -/* 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); -}