From patchwork Fri Nov 3 21:40:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 117962 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp213784qgn; Fri, 3 Nov 2017 14:41:26 -0700 (PDT) X-Google-Smtp-Source: ABhQp+QEIXYm19NYIIpmT/BdMc5AD4pUWj281I1cRrX6qcKxs0KuDaIe1irGIWxYqPqSOHmnou7k X-Received: by 10.159.211.65 with SMTP id g1mr8147904plp.312.1509745286485; Fri, 03 Nov 2017 14:41:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509745286; cv=none; d=google.com; s=arc-20160816; b=cQdPeHJ/M4jPZ1aWvsDuR265QXr+XcSSe3DvprHTi16jvK8cTWIEEtVLez9Zt40fVL YT5C4AAcRUD6gLzGqFlNIGg+YvUYxS/kNoA1rBmLfsgs5t8hEpiNJ1MBM3pEK409Smha d9Sy1/lk8Yj8gFpSXktye5XT/ahbcEwZaTQKu+LTPYiMf987B99sg4iAxxOy/DY7AK7e q2do817bu3yDng1jcWtJ9YGTYsRvB6J9sPuzOjxpdaMt1yaBEwKnE2D4+WfhMrRM1vq+ wD+U6S5jRcw85vZayT0WaBWaYx9K+OY3hb4DGoFFZ72TvHuRuTSusLt4iAbJ6wzc2Uud 3vHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=HdkD0T2n21vHzg99cvVKfadB/caMe+eoTMlf13Eqqe0=; b=rxlQo9BM6vkz2vtvk/864zaHOVE9n38NrqHzHwud/ydA8LnCWBr4kDdSMPuFkFkQs/ DiOVQlNS3LAWfghKdpETTZqpfcKJaiuEFAk4J485GSffc6awy+hEIECUnuijOLnP4DcF VDqqdZzotBaGwhw6OZag105XPK1Lkh4IgkUyXVljyehab4dG/Gi/Hdn+rr2/2/rxdyF0 weeuWWIUkINlpKHZEvJM6HF4ELNSRAVRLP+w020ONk2riJWKXyn6CqrHYe9baEyoXRGr wu7Nwc5qoGbiGoCGqGWPx0UfDOuHn1gcyZxMvCqnI2zTT67/ciY/pmywvCoAZJy8+hEV h3wQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IxFDjgRg; spf=pass (google.com: domain of libc-alpha-return-86727-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-86727-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id o69si7412818pfi.63.2017.11.03.14.41.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Nov 2017 14:41:26 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-86727-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 header.s=default header.b=IxFDjgRg; spf=pass (google.com: domain of libc-alpha-return-86727-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-86727-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=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=HlC63dHFziVo1FgRZaDiC6anGo0dA8D PmFxe5lBccAtXMGwrGHDBCdO3ren5ba2Mq0HkLaPIMm0hcBO7JeRstPhlUrqL8Wl Fd8TF1bmXs8rejzTxxnLq+kF6RF8NhshUmqMOkdJKQMt7Oqg56eaAT/of0rqUOYS YbW0yhAZDgXA= 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=6l+Qe8AfFfma4KUiVdjjyDvSV+Y=; b=IxFDj gRgMtO4vubbbqgkf9T0hsL2sTsZrXoIlpGKR9R4Ko/ZtqDkX9W3aJD8Qrwp5Jt3v fwNzswPlLfYS0uqEUH1L8n4M0d0jEyEjMCpaqNImb3Go9SZSg/E0YyiIJa2kz4uR tW3m3aHZKW34u6mE3EKCOzVQI3UolEcvyoP0eY= Received: (qmail 37793 invoked by alias); 3 Nov 2017 21:41:05 -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 37742 invoked by uid 89); 3 Nov 2017 21:41:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qk0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=HdkD0T2n21vHzg99cvVKfadB/caMe+eoTMlf13Eqqe0=; b=tG1YL4PdRKsAuJqo14iOBZLARnGO8sagmu9nwX++3s9vWyv0WixZ2Ci3PirUPYyb+A OPsunWbKcJYURahRRVF7B/ThjvGJT7zCkRz7GdJdycxmkxUZ9QNQtN3bEZ/DiAKAxSkN IlTHYCMoMVyQBqVY44BnPMZQ8ILvzgq4Mzgp9DdC1x7OtZu+GST4zjtlOMlOLjDha4a8 MZMUoto3Jz0/ICY7GywaqUkyj0ZMJ90l8FNvD4rTaqop1ZpAeY+fKJDgirEaBhVYrWNH yBlWl42y1uO57m9QJxbgERzk68yMMlbUEwEORjdXOqnZDTFlyOVFQjuHtnT1wC/Pqh+x tM8Q== X-Gm-Message-State: AJaThX7kougyHzr1YQBmoEqldtmZ5MWiH77/vTPWmoBh7r50pVBEmIQQ 5ikZNhdCzfFGnIABKgUVUOXSKVj7fG4= X-Received: by 10.55.212.149 with SMTP id s21mr11573798qks.16.1509745261098; Fri, 03 Nov 2017 14:41:01 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 3/6] Simplify Linux sig{timed}wait{info} implementations Date: Fri, 3 Nov 2017 19:40:46 -0200 Message-Id: <1509745249-11404-3-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1509745249-11404-1-git-send-email-adhemerval.zanella@linaro.org> References: <1509745249-11404-1-git-send-email-adhemerval.zanella@linaro.org> This patch simplifies sig{timed}wait{info} by: - Assuming __NR_rt_sigtimedwait existence on all architectures due minimum kernel version requirement. - Add libc.so private __sigtimedwait symbol. - Call __sigtimedwait on both sigwait and sigwaitinfo. Checked on x86_64-linux-gnu. * sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add __sigtimedwait. * sysdeps/unix/sysv/linux/sigtimedwait.c: Simplify includes and assume __NR_rt_sigtimedwait. * sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Call __sigtimedwait. * sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise. Signed-off-by: Adhemerval Zanella --- ChangeLog | 7 ++++ sysdeps/unix/sysv/linux/Versions | 1 + sysdeps/unix/sysv/linux/sigtimedwait.c | 9 ----- sysdeps/unix/sysv/linux/sigwait.c | 67 ++++------------------------------ sysdeps/unix/sysv/linux/sigwaitinfo.c | 40 ++------------------ 5 files changed, 18 insertions(+), 106 deletions(-) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions index 6c9e06f..d3dbcde 100644 --- a/sysdeps/unix/sysv/linux/Versions +++ b/sysdeps/unix/sysv/linux/Versions @@ -172,6 +172,7 @@ libc { __open_nocancel; __read_nocancel; __close_nocancel; + __sigtimedwait; # functions used by nscd __netlink_assert_response; } diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c index 21e9fca..f74a921 100644 --- a/sysdeps/unix/sysv/linux/sigtimedwait.c +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c @@ -17,13 +17,7 @@ #include #include -#include - -#include #include -#include - -#ifdef __NR_rt_sigtimedwait int __sigtimedwait (const sigset_t *set, siginfo_t *info, @@ -44,6 +38,3 @@ __sigtimedwait (const sigset_t *set, siginfo_t *info, } libc_hidden_def (__sigtimedwait) weak_alias (__sigtimedwait, sigtimedwait) -#else -# include -#endif diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c index 18a4485..2e8fa71 100644 --- a/sysdeps/unix/sysv/linux/sigwait.c +++ b/sysdeps/unix/sysv/linux/sigwait.c @@ -15,73 +15,20 @@ License along with the GNU C Library; if not, see . */ -#include #include -#define __need_NULL -#include -#include - -#include #include -#include - -#ifdef __NR_rt_sigtimedwait - -/* Return any pending signal or wait for one for the given time. */ -static int -do_sigwait (const sigset_t *set, int *sig) -{ - int ret; - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ -#ifdef INTERNAL_SYSCALL - INTERNAL_SYSCALL_DECL (err); - do - ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, set, - NULL, NULL, _NSIG / 8); - while (INTERNAL_SYSCALL_ERROR_P (ret, err) - && INTERNAL_SYSCALL_ERRNO (ret, err) == EINTR); - if (! INTERNAL_SYSCALL_ERROR_P (ret, err)) - { - *sig = ret; - ret = 0; - } - else - ret = INTERNAL_SYSCALL_ERRNO (ret, err); -#else - do - ret = INLINE_SYSCALL (rt_sigtimedwait, 4, set, NULL, NULL, _NSIG / 8); - while (ret == -1 && errno == EINTR); - if (ret != -1) - { - *sig = ret; - ret = 0; - } - else - ret = errno; -#endif - - return ret; -} int __sigwait (const sigset_t *set, int *sig) { - if (SINGLE_THREAD_P) - return do_sigwait (set, sig); - - int oldtype = LIBC_CANCEL_ASYNC (); - - int result = do_sigwait (set, sig); - - LIBC_CANCEL_RESET (oldtype); - - return result; + siginfo_t si; + if (__sigtimedwait (set, &si, 0) < 0) + return -1; + *sig = si.si_signo; + return 0; } libc_hidden_def (__sigwait) weak_alias (__sigwait, sigwait) -#else -# include -#endif strong_alias (__sigwait, __libc_sigwait) + +LIBC_CANCEL_HANDLED (); diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c index 0062d3e..6267425 100644 --- a/sysdeps/unix/sysv/linux/sigwaitinfo.c +++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c @@ -15,52 +15,18 @@ License along with the GNU C Library; if not, see . */ -#include #include -#define __need_NULL -#include -#include - -#include #include -#include - -#ifdef __NR_rt_sigtimedwait /* Return any pending signal or wait for one for the given time. */ int __sigwaitinfo (const sigset_t *set, siginfo_t *info) { - sigset_t tmpset; - if (set != NULL - && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) - || __builtin_expect (__sigismember (set, SIGSETXID), 0))) - { - /* Create a temporary mask without the bit for SIGCANCEL set. */ - // We are not copying more than we have to. - memcpy (&tmpset, set, _NSIG / 8); - __sigdelset (&tmpset, SIGCANCEL); - __sigdelset (&tmpset, SIGSETXID); - set = &tmpset; - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8); - - /* The kernel generates a SI_TKILL code in si_code in case tkill is - used. tkill is transparently used in raise(). Since having - SI_TKILL as a code is useful in general we fold the results - here. */ - if (result != -1 && info != NULL && info->si_code == SI_TKILL) - info->si_code = SI_USER; - - return result; + return __sigtimedwait (set, info, 0); } libc_hidden_def (__sigwaitinfo) weak_alias (__sigwaitinfo, sigwaitinfo) -#else -# include -#endif strong_alias (__sigwaitinfo, __libc_sigwaitinfo) + +LIBC_CANCEL_HANDLED ();