From patchwork Fri Feb 2 17:04:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 126757 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp819410ljc; Fri, 2 Feb 2018 09:05:58 -0800 (PST) X-Google-Smtp-Source: AH8x224qMhcgINPIoZ89qomqinXMUADQN75uc/v641TrqHG55D1SVJBJF0NaS1OEMEQ+Hv00Ziz6 X-Received: by 10.101.98.147 with SMTP id f19mr27910376pgv.100.1517591158013; Fri, 02 Feb 2018 09:05:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517591158; cv=none; d=google.com; s=arc-20160816; b=GTH59Ti1lJK7tRtMwwloEuhhtiJlDZxzwOddesy2UwdZtzBOhlbYUoxHAKvoV1rfyg bI4sUKOtWBHOkmQrBYKqLgAVw22dMBF2fCgj7pgSS0N7sJqe7TgIi/450eASMdHl9aid YCKoCZ1wsG86yiyQSDWwgbgA9pr4I4YRne/F2uFZGPtxmxrnzJd+UoxKw/OIH3X0+15I +MKTW98pLLCk8RvdrWHnYqPdL84hsjVyn784YE+hbHX8ljUedIaV1ppaT5Ghgpo7aQoq mHuuojOMERFw3mbKzkb2PtKlFyZq9vFORq5TmEIDC8KgUIfVL7/snaKzzr6m6m+JahBk is8Q== 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=KDyURPTgurLdf+owH/Pkges1bRhp93lJsbqUD4Jgb2Q=; b=SikbWnf0fq+PqRkkwv1TuVtXvx2iPPeZkq8LPIUeyIXl7vHmz/BJGGut4BKtmrxvEA uaNxYt6H+Tl1VERX0AVlZFltq3XpfPpEfSvEiBBCTp1g3mkWfKfa7KGyk6peVoOWAwS6 qoAEORxH769Vmz3iC/k1OvFCTgPkpiE4IdFylP1rUwdYAHpMRSTGmeMVDwZfuqdxmt3h AQOnWzHeS0ZAv5K6Wai6Tz5r/Xa/Y+LBEJJsN3LTf8pgqC6xZlBXg4kyiVvb82//750J bKzPhDDrAI63DfKSTw/3jBTCPXlZK9h0tu5M+Ho6ysBf785hCqSgwZefyc/2KQCuTHi7 1PTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=idRkGTkH; spf=pass (google.com: domain of libc-alpha-return-89925-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-89925-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 b1-v6si2126347pls.421.2018.02.02.09.05.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Feb 2018 09:05:58 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-89925-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=idRkGTkH; spf=pass (google.com: domain of libc-alpha-return-89925-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-89925-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=gTjCGFZ6EwG872WTZPVCLZhZdKejBlX bnExh+b6Us/whKh9CyFGnppEocc3nbyl05f/abaw6JrPfABXHiDgoEX3XNXa+A8F gxQgrWq19k+Y7p9qSdQ4OUYs/KkYIApe/r7X5DnBheC8eM22zHq1/PRdH+EL0OgI BSitrj6Sb1y0= 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=5yUdxgkLbGZ1E/P3/agLfNx6+rc=; b=idRkG TkHrEkJNYqpwmGlZ8oUtsDEB3RU4AUWM4udFHH+YZJashDnvXzYXu++TCnwuSkTb bFRwr5OTfkz1isPqwRyaGOFNGOUl7iaW0qXRvNU6ZJZ1pQzQdxBi4UxKGb73RY6D v2cyWiYhX+FR0d9oMorN5iRMPiR3kyMHXZeB0Y= Received: (qmail 130082 invoked by alias); 2 Feb 2018 17:05:11 -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 129970 invoked by uid 89); 2 Feb 2018 17:05:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=threadspecific, thread-specific X-HELO: mail-qk0-f196.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=KDyURPTgurLdf+owH/Pkges1bRhp93lJsbqUD4Jgb2Q=; b=I5G2Bg6mBmFZv8vsb604933Nww5pYsX9rA841N/FVvOU0UC/LQs2/BUk12s3BrdeFC CH5naoivpW3ljrYoc4AfsIlweuNXC+bwib/eBVSEJ02wzRjfJRlZ53s1/+/Tqb7LlXa/ /06nzpSrR75Ve5R5eNJlexiH7y2eQ55Ee9mGKxIQ2YuRTb59oihEZYOueogW7/TAx81v DMXjXmBjKQZFT7YNqDFCAw/g7lf9ehkjV/+NCSAs7Kp2Hb9y+IcWTjALlFm7TT0K88kk sbp/PbQ9fRkxwW3xLlAxlf6DuoPtTBaPZJH8mc8whKpJ5vGwvO6yUI/Z1nSggX+LqLnl U5yw== X-Gm-Message-State: AKwxyte1YnTSL1n/qFhM01FWtkX8pc7zgNuRxh8s6c+1ABUeqKrJ45uu rOZ29B5kqoRsMUJQcHjL2l4KFt6icqg= X-Received: by 10.233.239.23 with SMTP id d23mr64346926qkg.180.1517591099882; Fri, 02 Feb 2018 09:04:59 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v8 5/8] nptl: Add C11 threads tss_* functions Date: Fri, 2 Feb 2018 15:04:41 -0200 Message-Id: <1517591084-11347-6-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1517591084-11347-1-git-send-email-adhemerval.zanella@linaro.org> References: <1517591084-11347-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the tss_* definitions from C11 threads (ISO/IEC 9899:2011), more specifically tss_create, tss_delete, tss_get, tss_set, and required types. Mostly of the definitions are composed based on POSIX conterparts, including tss_t (pthread_key_t). Checked with a build for all major ABI (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabi, i386-linux-gnu, ia64-linux-gnu, m68k-linux-gnu, microblaze-linux-gnu [1], mips{64}-linux-gnu, nios2-linux-gnu, powerpc{64le}-linux-gnu, s390{x}-linux-gnu, sparc{64}-linux-gnu, tile{pro,gx}-linux-gnu, and x86_64-linux-gnu). Also ran a full check on aarch64-linux-gnu, x86_64-linux-gnu, i686-linux-gnu, arm-linux-gnueabhf, and powerpc64le-linux-gnu. * conform/data/threads.h-data (thread_local): New macro. (TSS_DTOR_ITERATIONS): Likewise. (tss_t): New type. (tss_dtor_t): Likewise. (tss_create): New function. (tss_get): Likewise. (tss_set): Likewise. (tss_delete): Likewise. * nptl/Makefile (libpthread-routines): Add tss_create, tss_delete, tss_get, and tss_set objects. * nptl/Versions (libpthread) [GLIBC_2.27]: Likewise. * nptl/tss_create.c: New file. * nptl/tss_delete.c: Likewise. * nptl/tss_get.c: Likewise. * nptl/tss_set.c: Likewise. * sysdeps/nptl/threads.h (thread_local): New define. (TSS_DTOR_ITERATIONS): Likewise. (tss_t): New typedef. (tss_dtor_t): Likewise. (tss_create): New prototype. (tss_get): Likewise. (tss_set): Likewise. (tss_delete): Likewise. --- ChangeLog | 24 ++++++++++++++++++++++++ conform/data/threads.h-data | 9 +++++++++ nptl/Makefile | 3 ++- nptl/Versions | 3 ++- nptl/tss_create.c | 28 ++++++++++++++++++++++++++++ nptl/tss_delete.c | 25 +++++++++++++++++++++++++ nptl/tss_get.c | 25 +++++++++++++++++++++++++ nptl/tss_set.c | 26 ++++++++++++++++++++++++++ sysdeps/nptl/threads.h | 24 ++++++++++++++++++++++++ 9 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 nptl/tss_create.c create mode 100644 nptl/tss_delete.c create mode 100644 nptl/tss_get.c create mode 100644 nptl/tss_set.c -- 2.7.4 diff --git a/conform/data/threads.h-data b/conform/data/threads.h-data index d7c562e..406e497 100644 --- a/conform/data/threads.h-data +++ b/conform/data/threads.h-data @@ -1,6 +1,8 @@ #if defined ISO11 macro ONCE_FLAG_INIT +macro thread_local +macro-int-constant TSS_DTOR_ITERATIONS constant thrd_success constant thrd_busy @@ -17,6 +19,8 @@ type thrd_start_t type mtx_t type once_flag type cnd_t +type tss_t +type tss_dtor_t function int thrd_create (thrd_t*, thrd_start_t, void*) function int thrd_equal (thrd_t, thrd_t) @@ -43,6 +47,11 @@ function int cnd_wait (cnd_t*, mtx_t*) function int cnd_timedwait (cnd_t*, mtx_t*, const struct timespec*) function void cnd_destroy (cnd_t*) +function int tss_create (tss_t*, tss_dtor_t) +function {void*} tss_get (tss_t) +function int tss_set (tss_t, void*) +function void tss_delete (tss_t) + #include "time.h-data" #endif diff --git a/nptl/Makefile b/nptl/Makefile index e13c07a..4ee1db0 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -144,7 +144,8 @@ libpthread-routines = nptl-init vars events version pt-interp \ thrd_exit thrd_join thrd_sleep thrd_yield \ mtx_destroy mtx_init mtx_lock mtx_timedlock \ mtx_trylock mtx_unlock call_once cnd_broadcast \ - cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait + cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait \ + tss_create tss_delete tss_get tss_set # pthread_setuid pthread_seteuid pthread_setreuid \ # pthread_setresuid \ # pthread_setgid pthread_setegid pthread_setregid \ diff --git a/nptl/Versions b/nptl/Versions index 0672286..3df32db 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -270,7 +270,8 @@ libpthread { thrd_create; thrd_current; thrd_detach; thrd_equal; thrd_exit; thrd_join; thrd_sleep; thrd_yield; mtx_init; mtx_lock; mtx_timedlock; mtx_trylock; mtx_unlock; mtx_destroy; call_once; cnd_broadcast; cnd_destroy; cnd_init; - cnd_signal; cnd_timedwait; cnd_wait; mtx_destroy; + cnd_signal; cnd_timedwait; cnd_wait; mtx_destroy; tss_create; tss_delete; + tss_get; tss_set; } GLIBC_PRIVATE { diff --git a/nptl/tss_create.c b/nptl/tss_create.c new file mode 100644 index 0000000..da1c91a --- /dev/null +++ b/nptl/tss_create.c @@ -0,0 +1,28 @@ +/* C11 threads thread-specific creation implementation. + Copyright (C) 2018 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 + . */ + +#include "thrd_priv.h" + +int +tss_create (tss_t *tss_id, tss_dtor_t destructor) +{ + _Static_assert (sizeof (tss_t) == sizeof (pthread_key_t), "tss_t size"); + + int err_code = __pthread_key_create (tss_id, destructor); + return thrd_err_map (err_code); +} diff --git a/nptl/tss_delete.c b/nptl/tss_delete.c new file mode 100644 index 0000000..0fc2975 --- /dev/null +++ b/nptl/tss_delete.c @@ -0,0 +1,25 @@ +/* C11 threads thread-specific delete implementation. + Copyright (C) 2018 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 + . */ + +#include "thrd_priv.h" + +void +tss_delete (tss_t tss_id) +{ + __pthread_key_delete (tss_id); +} diff --git a/nptl/tss_get.c b/nptl/tss_get.c new file mode 100644 index 0000000..5e09766 --- /dev/null +++ b/nptl/tss_get.c @@ -0,0 +1,25 @@ +/* C11 threads thread-specific get implementation. + Copyright (C) 2018 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 + . */ + +#include "thrd_priv.h" + +void * +tss_get (tss_t tss_id) +{ + return __pthread_getspecific (tss_id); +} diff --git a/nptl/tss_set.c b/nptl/tss_set.c new file mode 100644 index 0000000..03973d9 --- /dev/null +++ b/nptl/tss_set.c @@ -0,0 +1,26 @@ +/* C11 threads thread-specific set implementation. + Copyright (C) 2018 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 + . */ + +#include "thrd_priv.h" + +int +tss_set (tss_t tss_id, void *val) +{ + int err_code = __pthread_setspecific (tss_id, val); + return thrd_err_map (err_code); +} diff --git a/sysdeps/nptl/threads.h b/sysdeps/nptl/threads.h index eb89b0a..6a807ee 100644 --- a/sysdeps/nptl/threads.h +++ b/sysdeps/nptl/threads.h @@ -28,6 +28,10 @@ __BEGIN_DECLS #include #define ONCE_FLAG_INIT 0 +#define thread_local _Thread_local +#define TSS_DTOR_ITERATIONS 4 +typedef unsigned int tss_t; +typedef void (*tss_dtor_t) (void*); typedef unsigned long int thrd_t; typedef int (*thrd_start_t) (void*); @@ -171,6 +175,26 @@ extern int cnd_timedwait (cnd_t *__restrict __cond, resources. */ extern void cnd_destroy (cnd_t *__COND); + +/* Thread specific storage functions. */ + +/* Create new thread-specific storage key and stores it in the object pointed + by __TSS_ID. If __DESTRUCTOR is not NULL, the function will be called when + the thread terminates. */ +extern int tss_create (tss_t *__tss_id, tss_dtor_t __destructor); + +/* Return the value held in thread-specific storage for the current thread + identified by __TSS_ID. */ +extern void *tss_get (tss_t __tss_id); + +/* Sets the value of the thread-specific storage identified by __TSS_ID for + the current thread to __VAL. */ +extern int tss_set (tss_t __tss_id, void *__val); + +/* Destroys the thread-specific storage identified by __TSS_ID. The + destructor is not called until thrd_exit is called. */ +extern void tss_delete (tss_t __tss_id); + __END_DECLS #endif /* _THREADS_H */