From patchwork Tue Jun 27 18:31:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 106470 Delivered-To: patch@linaro.org Received: by 10.182.135.102 with SMTP id pr6csp2694223obb; Tue, 27 Jun 2017 11:32:52 -0700 (PDT) X-Received: by 10.101.85.14 with SMTP id f14mr6573099pgr.112.1498588372070; Tue, 27 Jun 2017 11:32:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1498588372; cv=none; d=google.com; s=arc-20160816; b=ISmqyZpVGoDczFTqKuwvHjijGtaW9wP78MWwnChdrFAHVgI7+JHJ2eWHF5SN6GvZko s4rLaRSnZcHSuhOzBQwvWHxJTQ/nZFvaKJ2qXimeZikG98GrkzSLl0tvXTo19O0vHCjY +j8eXVoyE0qOFUnTaPfmkVbgaFkHcjHuwEK/BYG9yK+KRDlyRwFi892EVmaWjIxA/P1r Ni647WuEOk+3U+1clHFIX3XJGX7pKs2/la3VXp8hqF868WbCAMqsHImhWcVBf6LMkoDL GwlGp1otiByr+Yv5ADJEU44xIn3xkBrrmOKAdTBB9IXrbj/VEZpqK2K7X5tiivzGcLxm B0Sw== 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=oCCLzu5hR1EsGZwL4RNXyhj6aieUoOE72XkJwCO9yIY=; b=XUdFIjc/f0nL+xIjwPSP+MJ+jEPXuncselbqJ2bN1rxx47Trsb+yGSOtThM/emdsqM 2FXb4UB4qp2BPeMJx8iNPrkF8qqNS+U6OBg3IUcXKoDYjoJDE7Cwk+Lrc38bIel7+jJ3 /BchzVXo+yHmVL9WvIrl9AbgTiOuRO7uXyI+dHhj3f92nYHp8ckuWp4dNlUOf4P/zKDC o2DmPTdpZkR0cuW84vlmK6gIWJzzD+Of4/CgTunjYsyITG8urV3L7jvoI1tnPewoUZlL /qTD8qNwYnINwwcPxesIowmn0FWyx189C/oVlMYxpMkPVaoGUpu+tzdnc0QbnToB67Jv gz1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.b=LlgPPEEu; spf=pass (google.com: domain of libc-alpha-return-81306-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-81306-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 a1si2364079pgc.203.2017.06.27.11.32.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Jun 2017 11:32:52 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-81306-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.b=LlgPPEEu; spf=pass (google.com: domain of libc-alpha-return-81306-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-81306-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=okU9cs4si1g1x6S1RB6YEcTSxzhLYUV h2bn3JWc+0FJZ/oLEv/fTvWlktmB8a0Ecj3Fj1bkYUlo6+DqVIEfs1Ywoswt93Jq aLAtyCJh3xqAV7dRYrWRXH4lMUVhXsTSSKC/tXHKOfGwo9hj0tGV9JqpXWyaE0Xf RQ0d3UvtFNkw= 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=ef1hvJFmpJs5SdBNpU7IETZ8Zhs=; b=LlgPP EEuPaOpWZlZgP5SDQXdYC8jqfbUdDLrlxni3fhoNjge8ET/vQc29Z49ShjSOah/L ofqG0FUAFGBALYWllucOFST625jLCifZ+3wfnpm8HeGH9nBgrHqDIf6/MMVN0PEz 3DTzPCFkv8yxPTtd8CCTF48btT1ka61e4rdP8I= Received: (qmail 21095 invoked by alias); 27 Jun 2017 18:31:51 -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 20962 invoked by uid 89); 27 Jun 2017 18:31:50 -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-f170.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=oCCLzu5hR1EsGZwL4RNXyhj6aieUoOE72XkJwCO9yIY=; b=gPtVuzfbOryjVhXyinwGGlRkttr1RjgZXFU0VwrdHfO8FVs5bFh78x5oEqv4jAze0P /aRjgXina7cLs4jaeVyMkQa9rq0zE9W8LIuoXXkZl00I1ETrjEhjI1W2OHBSl5Nz7QIp EaClqjynrTX85Sojta1c4k7z+G1ERpptM65N+DG2sZH1PIQboLr/RICU03EvIE+YwVsv TECWWaKoL/pSYsBxqPqq1054HWXUoWjTupreodOlYac9M5TRCTD8IPeJKrYitCW+ezGD AA4CNyOZXUpJEoRZJGQ/yfLf59HzLYS8/DOL308wyJ4BGoXDVl1NtjOGGgiNU0HpEqN+ KO5Q== X-Gm-Message-State: AKS2vOyO7gB6PofJEGM3rX2kBbwgkMTlYXZuBJ7NDod2L/vmutpzVQEZ O6fuZPIiHsdgWUtkFtT4CQ== X-Received: by 10.55.65.22 with SMTP id o22mr8294593qka.213.1498588303995; Tue, 27 Jun 2017 11:31:43 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 5/8] nptl: Add C11 threads tss_* functions Date: Tue, 27 Jun 2017 15:31:29 -0300 Message-Id: <1498588292-23093-6-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1498588292-23093-1-git-send-email-adhemerval.zanella@linaro.org> References: <1498588292-23093-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the mtx_* 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.26]: 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 | 29 +++++++++++++++++++++++++++++ nptl/tss_delete.c | 27 +++++++++++++++++++++++++++ nptl/tss_get.c | 27 +++++++++++++++++++++++++++ nptl/tss_set.c | 28 ++++++++++++++++++++++++++++ sysdeps/nptl/threads.h | 23 +++++++++++++++++++++++ 9 files changed, 171 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 9d0975a..9f74f3c 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -143,7 +143,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 98a2ce8..71f8aab 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..20e8ce3 --- /dev/null +++ b/nptl/tss_create.c @@ -0,0 +1,29 @@ +/* C11 threads thread-specific creation implementation. + Copyright (C) 2017 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" + +/* Create new thread-specific storage key and stores it in the object + pointed by tss_id. If destructor is not NULL, destructor function is + called when the thread terminates. */ +int +tss_create (tss_t *tss_id, tss_dtor_t destructor) +{ + 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..bcbc748 --- /dev/null +++ b/nptl/tss_delete.c @@ -0,0 +1,27 @@ +/* C11 threads thread-specific delete implementation. + Copyright (C) 2017 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" + +/* Destroys the thread-specific storage identified by tss_id. The + destructor is not called until thrd_exit is called. */ +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..784a1cf --- /dev/null +++ b/nptl/tss_get.c @@ -0,0 +1,27 @@ +/* C11 threads thread-specific get implementation. + Copyright (C) 2017 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" + +/* Return the value held in thread-specific storage for the current + thread identified by tss_id. */ +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..16a0b04 --- /dev/null +++ b/nptl/tss_set.c @@ -0,0 +1,28 @@ +/* C11 threads thread-specific set implementation. + Copyright (C) 2017 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" + +/* Sets the value of the thread-specific storage identified by tss_id for + the current thread to val. */ +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 cca3f5f..0f4def0 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*); @@ -172,6 +176,25 @@ 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, __destructor function is 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 */