From patchwork Fri Feb 2 17:04:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 126755 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp819037ljc; Fri, 2 Feb 2018 09:05:34 -0800 (PST) X-Google-Smtp-Source: AH8x227n6VRKF6gfvP1eCC+ncdjD/GxBkBngMbaxpaglT+/FBF5CFx9QSqzTVi8eb90CO+eJSctL X-Received: by 10.101.74.129 with SMTP id b1mr32795934pgu.317.1517591134701; Fri, 02 Feb 2018 09:05:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517591134; cv=none; d=google.com; s=arc-20160816; b=CkfC6xjiCZWXcNgYwGqqleUTsFewA8tKHHkYK92jM/DT74IFxInOh8v3JyWtuql69R BDne/zAdVOVYvexD04xTZMZ4WGumuQ55FHbUVHtuKV+152bbByP/sKTn1rpJdFCyQHa3 LJCRXXGUsge2OfkEyfg8Iyb76+D/2UzD2N4i58ldscBboI99pavQ8csmDMdGuORC53Du 8SuCjJdI4eD5GEMpTGf8E39llGGotdrkwq31ZiuE1nQ5ckbMkJRt17mdqOJpUeD4Wk9W kMuvKtItda3yQbG2QdkiHWDTGYszU2lXJw/PlXfBHlb3Gm9A9ZLzK2iABRZUn/35gDby ScNA== 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=EMiTjwKvGDSe+ovhc3SB+0t1SfYNbrKfAfhWa7hYe88=; b=GcNsVNw4bUbKaTIHU+pRc3NIk9+bEOK94gZZXjdl36I5slc/7s4ML16YTnsb72msRy 3peFicD0NXLPSP7lu9JbyDhSA+GpEGtQhnhXGgf7OZUPMRWs25dAHd9hOc1LjLLQB0S6 18ZhwlHKnQ2NCKIvuMO5uYk+bI7e4k1FRDPWTrhJGyiBPF1XXiidnGF4KzFFimMtVWCZ 1+44CbuBJWHDLJ5eFuD5/686uVYdZ3qLuBYLDIrl41sRGkxKDcw33wLmf7I4vn34cSJ2 u1BYJTyMJcZ/vhYAhl2pcPqEjFX5ntzx9KXh84jltMCsV+6fRpMkTvmmDUnoTNeVLnIQ x5ww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=uvH1m7OY; spf=pass (google.com: domain of libc-alpha-return-89923-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-89923-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 n15si1360373pgc.49.2018.02.02.09.05.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Feb 2018 09:05:34 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-89923-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=uvH1m7OY; spf=pass (google.com: domain of libc-alpha-return-89923-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-89923-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=dFDzqrvrLOdPHgQ/J/Utgvigztz96jY u8kWhAC1ZTXrfveoA5Zh1xq++ggC3KfCnbi2S5t2H/l/zfIiPCu5IWqU/dUUNSrd bWx5DrktqQR0xKAekuGsFUNazQ7qobbpZKGX6q0p1SeRTtF519zxY/OAP5ZCzwjn tRCC9mlA1h2w= 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=oPbLKxXGvg/Va3VF7T2dgzLOopw=; b=uvH1m 7OYwuKUdcHqzEbQz69oGQ+hItsB4N30JOyNw5sQorxgeeoPILsCb7cepXVHJBnz7 fkLpoH3Nv5h3JGVTGsiYUI/JhaNFE1nKd+HexyvuUZThHO6R/XNw2723fnk5b9af uYU8BWIwyhmdpkP/yqgaPVw7T8bDMnrJtJ+NJI= Received: (qmail 129100 invoked by alias); 2 Feb 2018 17:05:03 -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 128882 invoked by uid 89); 2 Feb 2018 17:05:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 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=unlock, interchange, 10035 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=EMiTjwKvGDSe+ovhc3SB+0t1SfYNbrKfAfhWa7hYe88=; b=hYNgTv5R3l02FDShqUue/r7GdSOagkALnbBPKb5ZwVLI8lL66EbvFbFxxD0BCE1vLr QmE07hCpswjJyafkaZo2Ij3FSnsYcviJV1/4NEFUgdfYHZ0dflEYlt2KUbRPWo612Y3s Xn6Bo0C+nHboJ7f5rwO2RBwgh5vj4xrHg0r91j7ImY61PO1NZmxPdqhA1NaF529BSpnx rYkbiA8vFwbljzW4XBVnfp2rCN3hWDMDLAns9JwaXxC7HkO755hs1AEaIdZZqCspvv/6 vVFgSp/rQEjnVCmF2EBQeAUmLK/AdjO3wgNPvOY0ngn8Kx1y+9DZITeO/R04+vFZ9dF4 b5Tw== X-Gm-Message-State: AKwxytc4DUc6DTDCWXutntt8lKqst4vCFn0jAElkTRjyv8uG+AwWIvZu yKEN3EFEqCKYVkniTD8XX3acH3krflU= X-Received: by 10.55.105.194 with SMTP id e185mr61844304qkc.350.1517591095360; Fri, 02 Feb 2018 09:04:55 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v8 2/8] nptl: Add C11 threads mtx_* functions Date: Fri, 2 Feb 2018 15:04:38 -0200 Message-Id: <1517591084-11347-3-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 mtx_* definitions from C11 threads (ISO/IEC 9899:2011), more specifically mtx_init, mtx_destroy, mtx_lock, mtx_timedlock, mtx_trylock, mtx_unlock, and required types. Mostly of the definitions are composed based on POSIX conterparts, and mtx_t is also based on internal pthread fields, but with a distinct internal layout to avoid possible issues with code interchange (such as trying to pass POSIX structure on C11 functions and to avoid inclusion of pthread.h). The idea is to make possible to share POSIX internal implementations for mostly of the code (and making adjustment only when required). 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 (mtx_plain): New constant. (mtx_recursive): Likewise. (mtx_timed): Likewise. (mtx_t): New type. (mtx_init): New function. (mtx_lock): Likewise. (mtx_timedlock): Likewise. (mtx_trylock): Likewise. (mtx_unlock): Likewise. (mtx_destroy): Likewise. * nptl/Makefile (libpthread-routines): Add mtx_destroy, mtx_init, mtx_lock, mtx_timedlock, mtx_trylock, and mtx_unlock object. * nptl/Versions (libpthread) [GLIBC_2.27]): Add mtx_init, mtx_lock, mtx_timedlock, mtx_trylock, mtx_unlock, and mtx_destroy. * nptl/mtx_destroy.c: New file. * nptl/mtx_init.c: Likewise. * nptl/mtx_lock.c: Likewise. * nptl/mtx_timedlock.c: Likewise. * nptl/mtx_trylock.c: Likewise. * nptl/mtx_unlock.c: Likewise. * sysdeps/nptl/threads.h (mtx_plain): New enumeration. (mtx_recursive): Likewise. (mtx_timed): Likewise. (mtx_t): New type. (mtx_init): New prototype. (mtx_lock): Likewise. (mtx_timedlock): Likewise. (mtx_trylock): Likewise. (mtx_unlock): Likewise. (mtx_destroy): Likewise. --- ChangeLog | 31 +++++++++++++++++++++++++++ conform/data/threads.h-data | 12 +++++++++++ nptl/Makefile | 4 +++- nptl/Versions | 3 ++- nptl/mtx_destroy.c | 26 +++++++++++++++++++++++ nptl/mtx_init.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ nptl/mtx_lock.c | 26 +++++++++++++++++++++++ nptl/mtx_timedlock.c | 28 ++++++++++++++++++++++++ nptl/mtx_trylock.c | 26 +++++++++++++++++++++++ nptl/mtx_unlock.c | 26 +++++++++++++++++++++++ sysdeps/nptl/threads.h | 44 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 nptl/mtx_destroy.c create mode 100644 nptl/mtx_init.c create mode 100644 nptl/mtx_lock.c create mode 100644 nptl/mtx_timedlock.c create mode 100644 nptl/mtx_trylock.c create mode 100644 nptl/mtx_unlock.c -- 2.7.4 Reviewed-by: Carlos O'Donell Reviewed-by: Carlos O'Donell diff --git a/conform/data/threads.h-data b/conform/data/threads.h-data index bc2d857..bb5ca75 100644 --- a/conform/data/threads.h-data +++ b/conform/data/threads.h-data @@ -6,8 +6,13 @@ constant thrd_error constant thrd_nomem constant thrd_timedout +constant mtx_plain +constant mtx_recursive +constant mtx_timed + type thrd_t type thrd_start_t +type mtx_t function int thrd_create (thrd_t*, thrd_start_t, void*) function int thrd_equal (thrd_t, thrd_t) @@ -18,6 +23,13 @@ function int thrd_detach (thrd_t) function int thrd_join (thrd_t, int*) function void thrd_yield (void) +function int mtx_init (mtx_t*, int) +function int mtx_lock (mtx_t*) +function int mtx_timedlock (mtx_t*, const struct timespec*) +function int mtx_trylock (mtx_t*) +function int mtx_unlock (mtx_t*) +function void mtx_destroy (mtx_t*) + #include "time.h-data" #endif diff --git a/nptl/Makefile b/nptl/Makefile index a853c46..1b8a6a8 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -141,7 +141,9 @@ libpthread-routines = nptl-init vars events version pt-interp \ pthread_setname pthread_getname \ pthread_setattr_default_np pthread_getattr_default_np \ thrd_create thrd_current thrd_detach thrd_equal \ - thrd_exit thrd_join thrd_sleep thrd_yield + thrd_exit thrd_join thrd_sleep thrd_yield \ + mtx_destroy mtx_init mtx_lock mtx_timedlock \ + mtx_trylock mtx_unlock # pthread_setuid pthread_seteuid pthread_setreuid \ # pthread_setresuid \ # pthread_setgid pthread_setegid pthread_setregid \ diff --git a/nptl/Versions b/nptl/Versions index 4905c84..a1969e3 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -268,7 +268,8 @@ libpthread { # C11 thread symbols. GLIBC_2.28 { thrd_create; thrd_current; thrd_detach; thrd_equal; thrd_exit; thrd_join; - thrd_sleep; thrd_yield; + thrd_sleep; thrd_yield; mtx_init; mtx_lock; mtx_timedlock; mtx_trylock; + mtx_unlock; mtx_destroy; } GLIBC_PRIVATE { diff --git a/nptl/mtx_destroy.c b/nptl/mtx_destroy.c new file mode 100644 index 0000000..15bc022 --- /dev/null +++ b/nptl/mtx_destroy.c @@ -0,0 +1,26 @@ +/* C11 threads mutex destroy 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" +#include "pthreadP.h" + +void +mtx_destroy (mtx_t *mutex) +{ + __pthread_mutex_destroy ((pthread_mutex_t *) mutex); +} diff --git a/nptl/mtx_init.c b/nptl/mtx_init.c new file mode 100644 index 0000000..594dbf3 --- /dev/null +++ b/nptl/mtx_init.c @@ -0,0 +1,52 @@ +/* C11 threads mutex initialization 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 + +#include "thrd_priv.h" + +int +mtx_init (mtx_t *mutex, int type) +{ + _Static_assert (sizeof (mtx_t) == sizeof (pthread_mutex_t), "mtx_t size"); + _Static_assert (alignof (mtx_t) == alignof (pthread_mutex_t), + "mtx_t alignment"); + + pthread_mutexattr_t attr; + + __pthread_mutexattr_init (&attr); + + /* Another possible solution would be to set the flags directly in + mutex object. */ + switch (type) + { + case mtx_plain | mtx_recursive: + case mtx_timed | mtx_recursive: + __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + break; + case mtx_plain: + case mtx_timed: /* No difference between both in standard */ + default: + __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_NORMAL); + break; + } + + int err_code = __pthread_mutex_init ((pthread_mutex_t *) mutex, &attr); + /* pthread_mutexattr_destroy implementation is a noop. */ + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_lock.c b/nptl/mtx_lock.c new file mode 100644 index 0000000..9b3e6cd --- /dev/null +++ b/nptl/mtx_lock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex lock 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 +mtx_lock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_lock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_timedlock.c b/nptl/mtx_timedlock.c new file mode 100644 index 0000000..0972622 --- /dev/null +++ b/nptl/mtx_timedlock.c @@ -0,0 +1,28 @@ +/* C11 threads mutex timed lock 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 +mtx_timedlock (mtx_t *restrict mutex, + const struct timespec *restrict time_point) +{ + int err_code = __pthread_mutex_timedlock ((pthread_mutex_t *)mutex, + time_point); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_trylock.c b/nptl/mtx_trylock.c new file mode 100644 index 0000000..f9b6a69 --- /dev/null +++ b/nptl/mtx_trylock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex try lock 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 +mtx_trylock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_trylock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_unlock.c b/nptl/mtx_unlock.c new file mode 100644 index 0000000..07f68f6 --- /dev/null +++ b/nptl/mtx_unlock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex unlock 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 +mtx_unlock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_unlock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/sysdeps/nptl/threads.h b/sysdeps/nptl/threads.h index 6adcac4..42d9b5c 100644 --- a/sysdeps/nptl/threads.h +++ b/sysdeps/nptl/threads.h @@ -24,6 +24,7 @@ __BEGIN_DECLS +#include #include typedef unsigned long int thrd_t; @@ -39,6 +40,20 @@ enum thrd_timedout = 4 }; +/* Mutex types. */ +enum +{ + mtx_plain = 0, + mtx_recursive = 1, + mtx_timed = 2 +}; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_MUTEX_T]; + long int __align __LOCK_ALIGNMENT; +} mtx_t; + /* Threads functions. */ /* Create a new thread executing the function __FUNC. Arguments for __FUNC @@ -85,6 +100,35 @@ thrd_equal (thrd_t __thread1, thrd_t __thread2) } #endif + +/* Mutex functions. */ + +/* Creates a new mutex object with type __TYPE. If successful the new + object is pointed by __MUTEX. */ +extern int mtx_init (mtx_t *__mutex, int __type); + +/* Block the current thread until the mutex pointed to by __MUTEX is + unlocked. In that case current thread will not be blocked. */ +extern int mtx_lock (mtx_t *__mutex); + +/* Block the current thread until the mutex pointed by __MUTEX is unlocked + or time pointed by __TIME_POINT is reached. In case the mutex is unlock, + the current thread will not be blocked. */ +extern int mtx_timedlock (mtx_t *__restrict __mutex, + const struct timespec *__restrict __time_point); + +/* Try to lock the mutex pointed by __MUTEX without blocking. If the mutex + is free the current threads takes control of it, otherwise it returns + immediately. */ +extern int mtx_trylock (mtx_t *__mutex); + +/* Unlock the mutex pointed by __MUTEX. It may potentially awake other + threads waiting on this mutex. */ +extern int mtx_unlock (mtx_t *__mutex); + +/* Destroy the mutex object pointed by __MUTEX. */ +extern void mtx_destroy (mtx_t *__mutex); + __END_DECLS #endif /* _THREADS_H */