From patchwork Wed May 10 18:40:53 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: 99013 Delivered-To: patch@linaro.org Received: by 10.182.142.97 with SMTP id rv1csp335688obb; Wed, 10 May 2017 11:41:40 -0700 (PDT) X-Received: by 10.84.233.205 with SMTP id m13mr10241490pln.72.1494441700510; Wed, 10 May 2017 11:41:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494441700; cv=none; d=google.com; s=arc-20160816; b=oEYAqjapYVOOCYpxEYlwJjanNBgkuqOIH02PVR9oN2zQSnHHY0EWPAoIMyS8WViNyU Z3rHeeYeQsSj3jKOrzamAtiHNbkhLbwtMA9NrUmRDfZHqznuJS3CZemMSZbbtaLJyqtm 9Ro9dbzOsAjwTcir+Nuj0YRwoF4YgB0o3cei34riOkS19QjDz2mbEVAeCCaFh2ZO1jbV ZpAMGiReU2Ip669sGiArDJEOHiChZu4y4Sbx0Fu2vAPrna6RCfXVax1bUnvDxEyE5O94 CE1NH1L2Amt0NnsLD8X4gBreHaMKACH+huJAn1Y8g7P/Wzh5pHuPxwL/dkdIAfgzO7S+ z3hw== 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=JY/F328Z7q5yDTWECF9g8tF8TSiqh6RaQHAfGpcZqoA=; b=FqPhf+Y2BWvLFKfs1CfCrp6AtTs2dBa26OueRSEMavJicfL2NObFvvF5Wk+YQYUu85 7sGPAaiXqHvPSGNCgF0Dlir1lbyJYfomwy1Z3EJr/cig+yIaI589Yi7lC6ES+v7SKOuJ X/QxiqXEobVi7tAyuvX1uV26P0+zATGHALKS3QFXSlDtK3xXhTI9F3n6UjiaiX1SaVta kg02KJtKmdTzEJ758THL94iqiHl340y68OsRwd+/Yk8nbq5V5jcCqKQndyRM7cX2EtNq rfwzmtG2s9ti+ymnss5ZR2AMDykm6HYMVOX2ddSUaknco74UUfn0FMEttfMKdHbElVf+ sScw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-79231-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79231-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 u27si3828769pfj.61.2017.05.10.11.41.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 May 2017 11:41:40 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-79231-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-79231-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79231-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=MrJwDV0p7gCcfmyfM6XJl1kM5OXLnmM Vx9d3ZP2zFl9kdGUvutrSpDEGkkkCXbhLen6Eg95fB2Y5HQC1iUGEzpwcoIA0r3w c46CNfrWxuuHIbqqEX+iDEzULNJ15JZEkiy6PJSWBBhKo90il9GNN+yq5iXvJ4+q 6WAgDI3zid/Q= 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=eaCLpwmN5rL/rgd02sxOZWv5j8g=; b=IWXs3 4J5z6zqyy1QzWZJONmF+S+dyBYxTuW2750oUZ65LiVBiZrlQDAdWDxa9aF9DSqeP K49nOhhlGGqXIyvxlGij4XZr3r0o1xAiWkv0D5gbSp1TqXceHcgHwm1cVdl/ThP0 maHi81btr5SA//tnc7RnQ3BzdoLijQUKo2f0uI= Received: (qmail 108054 invoked by alias); 10 May 2017 18:41:13 -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 108003 invoked by uid 89); 10 May 2017 18:41:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.7 required=5.0 tests=AWL, 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=1445, 995 X-HELO: mail-qk0-f182.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=JY/F328Z7q5yDTWECF9g8tF8TSiqh6RaQHAfGpcZqoA=; b=HoIrwduw2Zw2MFBzwPSST+/Oe38Vee29H9ejMpXUBrXCHPb8K2P3xNYFxTdQu03rrd w6//klOZqZfKDvbYcGKojVovFeQhQZeBdpcPFsypgrXSHzuLTugX6jRmZeQHsnnZSrPJ juQhswfV02BWcR3ly6o/FQd0Kd/OqEog6BgR43IpmW17/z+Q4HwOwX0eAcrN0xiG5yoK BgM2o9DebzESqsvYyw9Ng4CLRFi4aaYP8IfZ0LCEmqCa9rSqeP3OYAeveApGRebEL02Y BUunMoMCSmj1//vA/NayPgB345/hRxYvBuW2ITgc8qohk7w6RXju8i5opb79enyp1hps P4Kg== X-Gm-Message-State: AODbwcD1PKpTwouNkksLVrZYP67VXjCvow7OtLQV9v6UwkUP1ZyALPI2 BmLozIPXPcWvP6ocH2J0zw== X-Received: by 10.55.79.211 with SMTP id d202mr6510130qkb.298.1494441665599; Wed, 10 May 2017 11:41:05 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v4 1/4] Clean pthread functions namespaces for C11 threads Date: Wed, 10 May 2017 15:40:53 -0300 Message-Id: <1494441656-1212-2-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> References: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds internal definition (through {libc_}hidden_{proto,def}) and also change some strong to weak alias for symbols that might be used by C11 threads implementations. The patchset should not change libc/libpthread functional, although object changes are expected (since now internal symbols are used instead) and final exported symbols through GLIBC_PRIVATE is also expanded (to cover libpthread usage of __mmap{64}, __munmap, __mprotect). 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). * include/sched.h (__sched_get_priority_max): Add libc hidden proto. (__sched_get_prioriry_min): Likewise. * include/sys/mman.h (__mmap): Likewise. (__mmap64): Likewise. (__munmap): Likewise. (__mprotect): Likewise. * include/termios.h (__tcsetattr): Likewise. * include/time.h (__nanosleep): Use hidden_proto instead of libc_hidden_proto. * posix/nanosleep.c (__nanosleep): Likewise. * misc/Versions (libc): Export __mmap, __munmap, __mprotect, __sched_get_priority_min, and __sched_get_priority_max under GLIBC_PRIVATE. * nptl/allocatestack.c (__free_stacks): Use internal definition for libc symbols. (change_stack_perm): Likewise. (allocate_stack): Likewise. * sysdeps/posix/gethostname.c: Likewise. * nptl/tpp.c (__init_sched_fifo_prio): Likewise. * sysdeps/unix/sysv/linux/i386/smp.h (is_smp_system): Likewise. * sysdeps/unix/sysv/linux/powerpc/ioctl.c (__ioctl): Likewise. * nptl/pthreadP.h (__pthread_mutex_timedlock): Add definition. (__pthread_key_delete): Likewise. (__pthread_detach): Likewise. (__pthread_cancel): Likewise. (__pthread_mutex_trylock): Likewise. (__pthread_mutexattr_init): Likewise. (__pthread_mutexattr_settype): Likewise. * nptl/pthread_cancel.c (pthread_cancel): Change to internal name and create alias for exported one. * nptl/pthread_join.c (pthread_join): Likewise. * nptl/pthread_detach.c (pthread_detach): Likewise. * nptl/pthread_key_delete.c (pthread_key_delete): Likewise. * nptl/pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. * nptl/pthread_create.c: Change static requirements for pthread symbols. * nptl/pthread_equal.c (__pthread_equal): Change strong alias to weak for internal definition. * nptl/pthread_exit.c (__pthread_exit): Likewise. * nptl/pthread_getspecific.c (__pthread_getspecific): Likewise. * nptl/pthread_key_create.c (__pthread_key_create): Likewise. * nptl/pthread_mutex_destroy.c (__pthread_mutex_destroy): Likewise. * nptl/pthread_mutex_init.c (__pthread_mutex_init): Likewise. * nptl/pthread_mutex_lock.c (__pthread_mutex_lock): Likewise. * nptl/pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise. * nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock): Likewise. * nptl/pthread_mutexattr_init.c (__pthread_mutexattr_init): Likwise. * nptl/pthread_mutexattr_settype.c (__pthread_mutexattr_settype): Likewise. * nptl/pthread_self.c (__pthread_self): Likewise. * nptl/pthread_setspecific.c (__pthread_setspecific): Likewise. * sysdeps/unix/sysv/linux/tcsetattr.c (tcsetattr): Likewise. * misc/mmap.c (__mmap): Add internal symbol definition. * misc/mmap.c (__mmap64): Likewise. * sysdeps/unix/sysv/linux/mmap.c (__mmap): Likewise. * sysdeps/unix/sysv/linux/mmap64.c (__mmap): Likewise. (__mmap64): Likewise. * sysdeps/unix/sysv/linux/i386/Versions (libc) [GLIBC_PRIVATE): Add __uname. --- ChangeLog | 63 +++++++++++++++++++++++++++++++++ include/sched.h | 2 ++ include/sys/mman.h | 4 +++ include/termios.h | 2 ++ include/time.h | 2 +- misc/Versions | 2 ++ misc/mmap.c | 1 + misc/mmap64.c | 1 + nptl/allocatestack.c | 24 ++++++------- nptl/pthreadP.h | 9 +++++ nptl/pthread_cancel.c | 7 ++-- nptl/pthread_create.c | 18 +++++----- nptl/pthread_detach.c | 3 +- nptl/pthread_equal.c | 2 +- nptl/pthread_exit.c | 4 +-- nptl/pthread_getspecific.c | 2 +- nptl/pthread_join.c | 3 +- nptl/pthread_key_create.c | 2 +- nptl/pthread_key_delete.c | 3 +- nptl/pthread_mutex_destroy.c | 2 +- nptl/pthread_mutex_init.c | 2 +- nptl/pthread_mutex_lock.c | 2 +- nptl/pthread_mutex_timedlock.c | 5 +-- nptl/pthread_mutex_trylock.c | 3 +- nptl/pthread_mutex_unlock.c | 2 +- nptl/pthread_mutexattr_init.c | 3 +- nptl/pthread_mutexattr_settype.c | 3 +- nptl/pthread_self.c | 2 +- nptl/pthread_setspecific.c | 2 +- nptl/tpp.c | 4 +-- posix/nanosleep.c | 2 +- sysdeps/posix/gethostname.c | 2 +- sysdeps/unix/sysv/linux/i386/Versions | 2 +- sysdeps/unix/sysv/linux/i386/smp.h | 2 +- sysdeps/unix/sysv/linux/mmap.c | 1 + sysdeps/unix/sysv/linux/mmap64.c | 2 ++ sysdeps/unix/sysv/linux/powerpc/ioctl.c | 6 ++-- sysdeps/unix/sysv/linux/tcsetattr.c | 3 +- 38 files changed, 150 insertions(+), 54 deletions(-) -- 2.7.4 diff --git a/include/sched.h b/include/sched.h index b4d7406..f75faed 100644 --- a/include/sched.h +++ b/include/sched.h @@ -13,7 +13,9 @@ extern int __sched_getscheduler (__pid_t __pid); extern int __sched_yield (void); libc_hidden_proto (__sched_yield) extern int __sched_get_priority_max (int __algorithm); +libc_hidden_proto (__sched_get_priority_max) extern int __sched_get_priority_min (int __algorithm); +libc_hidden_proto (__sched_get_priority_min) extern int __sched_rr_get_interval (__pid_t __pid, struct timespec *__t); /* These are Linux specific. */ diff --git a/include/sys/mman.h b/include/sys/mman.h index 7026f69..8b996fc 100644 --- a/include/sys/mman.h +++ b/include/sys/mman.h @@ -5,10 +5,14 @@ /* Now define the internal interfaces. */ extern void *__mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, __off_t __offset); +libc_hidden_proto (__mmap) extern void *__mmap64 (void *__addr, size_t __len, int __prot, int __flags, int __fd, __off64_t __offset); +libc_hidden_proto (__mmap64) extern int __munmap (void *__addr, size_t __len); +libc_hidden_proto (__munmap) extern int __mprotect (void *__addr, size_t __len, int __prot); +libc_hidden_proto (__mprotect) extern int __madvise (void *__addr, size_t __len, int __advice); libc_hidden_proto (__madvise) diff --git a/include/termios.h b/include/termios.h index fad51f8..1a36e22 100644 --- a/include/termios.h +++ b/include/termios.h @@ -4,6 +4,8 @@ #ifndef _ISOMAC /* Now define the internal interfaces. */ extern int __tcgetattr (int __fd, struct termios *__termios_p); +extern int __tcsetattr (int __fd, int __optional_actions, + const struct termios *__termios_p); extern int __libc_tcdrain (int __fd); diff --git a/include/time.h b/include/time.h index 6badf0e..c5f64b3 100644 --- a/include/time.h +++ b/include/time.h @@ -80,7 +80,7 @@ extern struct tm *__tz_convert (const time_t *timer, int use_localtime, struct t extern int __nanosleep (const struct timespec *__requested_time, struct timespec *__remaining); -libc_hidden_proto (__nanosleep) +hidden_proto (__nanosleep) extern int __nanosleep_nocancel (const struct timespec *__requested_time, struct timespec *__remaining) attribute_hidden; diff --git a/misc/Versions b/misc/Versions index f2c90ff..7d8bc4e 100644 --- a/misc/Versions +++ b/misc/Versions @@ -160,5 +160,7 @@ libc { __mktemp; __libc_ifunc_impl_list; __tdelete; __tfind; __tsearch; __twalk; + __mmap; __munmap; __mprotect; + __sched_get_priority_min; __sched_get_priority_max; } } diff --git a/misc/mmap.c b/misc/mmap.c index 576d66a..4172d76 100644 --- a/misc/mmap.c +++ b/misc/mmap.c @@ -37,3 +37,4 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) stub_warning (mmap) weak_alias (__mmap, mmap) +libc_hidden_def (__mmap) diff --git a/misc/mmap64.c b/misc/mmap64.c index 6b1ac41..845b847 100644 --- a/misc/mmap64.c +++ b/misc/mmap64.c @@ -45,3 +45,4 @@ __mmap64 (__ptr_t addr, size_t len, int prot, int flags, int fd, } weak_alias (__mmap64, mmap64) +libc_hidden_def (__mmap64) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index e5c5f79..d8466e7 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -278,7 +278,7 @@ __free_stacks (size_t limit) /* Remove this block. This should never fail. If it does something is really wrong. */ - if (munmap (curr->stackblock, curr->stackblock_size) != 0) + if (__munmap (curr->stackblock, curr->stackblock_size) != 0) abort (); /* Maybe we have freed enough. */ @@ -328,7 +328,7 @@ change_stack_perm (struct pthread *pd #else # error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" #endif - if (mprotect (stack, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) + if (__mprotect (stack, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) return errno; return 0; @@ -490,8 +490,8 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, size += pagesize_m1 + 1; #endif - mem = mmap (NULL, size, prot, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); + mem = __mmap (NULL, size, prot, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); if (__glibc_unlikely (mem == MAP_FAILED)) return errno; @@ -545,7 +545,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, assert (errno == ENOMEM); /* Free the stack memory we just allocated. */ - (void) munmap (mem, size); + (void) __munmap (mem, size); return errno; } @@ -575,7 +575,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, if (err != 0) { /* Free the stack memory we just allocated. */ - (void) munmap (mem, size); + (void) __munmap (mem, size); return err; } @@ -600,7 +600,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, #elif _STACK_GROWS_UP char *guard = (char *) (((uintptr_t) pd - guardsize) & ~pagesize_m1); #endif - if (mprotect (guard, guardsize, PROT_NONE) != 0) + if (__mprotect (guard, guardsize, PROT_NONE) != 0) { mprot_error: lll_lock (stack_cache_lock, LLL_PRIVATE); @@ -618,7 +618,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, of memory caused problems we better do not use it anymore. Uh, and we ignore possible errors. There is nothing we could do. */ - (void) munmap (mem, size); + (void) __munmap (mem, size); return errno; } @@ -635,19 +635,19 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, char *oldguard = mem + (((size - pd->guardsize) / 2) & ~pagesize_m1); if (oldguard < guard - && mprotect (oldguard, guard - oldguard, prot) != 0) + && __mprotect (oldguard, guard - oldguard, prot) != 0) goto mprot_error; - if (mprotect (guard + guardsize, + if (__mprotect (guard + guardsize, oldguard + pd->guardsize - guard - guardsize, prot) != 0) goto mprot_error; #elif _STACK_GROWS_DOWN - if (mprotect ((char *) mem + guardsize, pd->guardsize - guardsize, + if (__mprotect ((char *) mem + guardsize, pd->guardsize - guardsize, prot) != 0) goto mprot_error; #elif _STACK_GROWS_UP - if (mprotect ((char *) pd - pd->guardsize, + if (__mprotect ((char *) pd - pd->guardsize, pd->guardsize - guardsize, prot) != 0) goto mprot_error; #endif diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 7fc1e50..6e7d6ff 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -428,6 +428,8 @@ extern int __pthread_mutex_init (pthread_mutex_t *__mutex, extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex); extern int __pthread_mutex_trylock (pthread_mutex_t *_mutex); extern int __pthread_mutex_lock (pthread_mutex_t *__mutex); +extern int __pthread_mutex_timedlock (pthread_mutex_t *__mutex, + const struct timespec *__abstime); extern int __pthread_mutex_cond_lock (pthread_mutex_t *__mutex) attribute_hidden internal_function; extern void __pthread_mutex_cond_lock_adjust (pthread_mutex_t *__mutex) @@ -491,6 +493,7 @@ extern int __pthread_cond_timedwait (pthread_cond_t *cond, extern int __pthread_condattr_destroy (pthread_condattr_t *attr); extern int __pthread_condattr_init (pthread_condattr_t *attr); extern int __pthread_key_create (pthread_key_t *key, void (*destr) (void *)); +extern int __pthread_key_delete (pthread_key_t key); extern void *__pthread_getspecific (pthread_key_t key); extern int __pthread_setspecific (pthread_key_t key, const void *value); extern int __pthread_once (pthread_once_t *once_control, @@ -499,8 +502,11 @@ extern int __pthread_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void)); extern pthread_t __pthread_self (void); extern int __pthread_equal (pthread_t thread1, pthread_t thread2); +extern int __pthread_detach (pthread_t th); +extern int __pthread_cancel (pthread_t th); extern int __pthread_kill (pthread_t threadid, int signo); extern void __pthread_exit (void *value) __attribute__ ((__noreturn__)); +extern int __pthread_join (pthread_t threadid, void **thread_return); extern int __pthread_setcanceltype (int type, int *oldtype); extern int __pthread_enable_asynccancel (void) attribute_hidden; extern void __pthread_disable_asynccancel (int oldtype) @@ -511,6 +517,7 @@ extern void __pthread_testcancel (void); hidden_proto (__pthread_mutex_init) hidden_proto (__pthread_mutex_destroy) hidden_proto (__pthread_mutex_lock) +hidden_proto (__pthread_mutex_trylock) hidden_proto (__pthread_mutex_unlock) hidden_proto (__pthread_rwlock_rdlock) hidden_proto (__pthread_rwlock_wrlock) @@ -521,6 +528,8 @@ hidden_proto (__pthread_setspecific) hidden_proto (__pthread_once) hidden_proto (__pthread_setcancelstate) hidden_proto (__pthread_testcancel) +hidden_proto (__pthread_mutexattr_init) +hidden_proto (__pthread_mutexattr_settype) #endif extern int __pthread_cond_broadcast_2_0 (pthread_cond_2_0_t *cond); diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 231a58d..742dfe6 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -25,7 +25,7 @@ #include int -pthread_cancel (pthread_t th) +__pthread_cancel (pthread_t th) { volatile struct pthread *pd = (volatile struct pthread *) th; @@ -66,7 +66,7 @@ pthread_cancel (pthread_t th) #ifdef SIGCANCEL /* The cancellation handler will take care of marking the thread as canceled. */ - pid_t pid = getpid (); + pid_t pid = __getpid (); INTERNAL_SYSCALL_DECL (err); int val = INTERNAL_SYSCALL_CALL (tgkill, err, pid, pd->tid, @@ -99,5 +99,6 @@ pthread_cancel (pthread_t th) return result; } +weak_alias (__pthread_cancel, pthread_cancel) -PTHREAD_STATIC_FN_REQUIRE (pthread_create) +PTHREAD_STATIC_FN_REQUIRE (__pthread_create) diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index c7d1b8f..7a970ff 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -920,14 +920,14 @@ compat_symbol (libpthread, __pthread_create_2_0, pthread_create, /* If pthread_create is present, libgcc_eh.a and libsupc++.a expects some other POSIX thread functions to be present as well. */ -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_lock) -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_trylock) -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_unlock) +PTHREAD_STATIC_FN_REQUIRE (__pthread_mutex_lock) +PTHREAD_STATIC_FN_REQUIRE (__pthread_mutex_trylock) +PTHREAD_STATIC_FN_REQUIRE (__pthread_mutex_unlock) -PTHREAD_STATIC_FN_REQUIRE (pthread_once) -PTHREAD_STATIC_FN_REQUIRE (pthread_cancel) +PTHREAD_STATIC_FN_REQUIRE (__pthread_once) +PTHREAD_STATIC_FN_REQUIRE (__pthread_cancel) -PTHREAD_STATIC_FN_REQUIRE (pthread_key_create) -PTHREAD_STATIC_FN_REQUIRE (pthread_key_delete) -PTHREAD_STATIC_FN_REQUIRE (pthread_setspecific) -PTHREAD_STATIC_FN_REQUIRE (pthread_getspecific) +PTHREAD_STATIC_FN_REQUIRE (__pthread_key_create) +PTHREAD_STATIC_FN_REQUIRE (__pthread_key_delete) +PTHREAD_STATIC_FN_REQUIRE (__pthread_setspecific) +PTHREAD_STATIC_FN_REQUIRE (__pthread_getspecific) diff --git a/nptl/pthread_detach.c b/nptl/pthread_detach.c index 8a2e943..5c4c8f7 100644 --- a/nptl/pthread_detach.c +++ b/nptl/pthread_detach.c @@ -22,7 +22,7 @@ int -pthread_detach (pthread_t th) +__pthread_detach (pthread_t th) { struct pthread *pd = (struct pthread *) th; @@ -53,3 +53,4 @@ pthread_detach (pthread_t th) return result; } +weak_alias (__pthread_detach, pthread_detach) diff --git a/nptl/pthread_equal.c b/nptl/pthread_equal.c index e304add..b5244ee 100644 --- a/nptl/pthread_equal.c +++ b/nptl/pthread_equal.c @@ -24,4 +24,4 @@ __pthread_equal (pthread_t thread1, pthread_t thread2) { return thread1 == thread2; } -strong_alias (__pthread_equal, pthread_equal) +weak_alias (__pthread_equal, pthread_equal) diff --git a/nptl/pthread_exit.c b/nptl/pthread_exit.c index dffab09..7209769 100644 --- a/nptl/pthread_exit.c +++ b/nptl/pthread_exit.c @@ -27,8 +27,8 @@ __pthread_exit (void *value) __do_cancel (); } -strong_alias (__pthread_exit, pthread_exit) +weak_alias (__pthread_exit, pthread_exit) /* After a thread terminates, __libc_start_main decrements __nptl_nthreads defined in pthread_create.c. */ -PTHREAD_STATIC_FN_REQUIRE (pthread_create) +PTHREAD_STATIC_FN_REQUIRE (__pthread_create) diff --git a/nptl/pthread_getspecific.c b/nptl/pthread_getspecific.c index ddedcf2..114d6da 100644 --- a/nptl/pthread_getspecific.c +++ b/nptl/pthread_getspecific.c @@ -63,5 +63,5 @@ __pthread_getspecific (pthread_key_t key) return result; } -strong_alias (__pthread_getspecific, pthread_getspecific) +weak_alias (__pthread_getspecific, pthread_getspecific) hidden_def (__pthread_getspecific) diff --git a/nptl/pthread_join.c b/nptl/pthread_join.c index 0192f69..afc8c37 100644 --- a/nptl/pthread_join.c +++ b/nptl/pthread_join.c @@ -37,7 +37,7 @@ cleanup (void *arg) int -pthread_join (pthread_t threadid, void **thread_return) +__pthread_join (pthread_t threadid, void **thread_return) { struct pthread *pd = (struct pthread *) threadid; @@ -115,3 +115,4 @@ pthread_join (pthread_t threadid, void **thread_return) return result; } +weak_alias (__pthread_join, pthread_join) diff --git a/nptl/pthread_key_create.c b/nptl/pthread_key_create.c index 4f51c76..70c0e12 100644 --- a/nptl/pthread_key_create.c +++ b/nptl/pthread_key_create.c @@ -47,5 +47,5 @@ __pthread_key_create (pthread_key_t *key, void (*destr) (void *)) return EAGAIN; } -strong_alias (__pthread_key_create, pthread_key_create) +weak_alias (__pthread_key_create, pthread_key_create) hidden_def (__pthread_key_create) diff --git a/nptl/pthread_key_delete.c b/nptl/pthread_key_delete.c index 605f93b..426163d 100644 --- a/nptl/pthread_key_delete.c +++ b/nptl/pthread_key_delete.c @@ -22,7 +22,7 @@ int -pthread_key_delete (pthread_key_t key) +__pthread_key_delete (pthread_key_t key) { int result = EINVAL; @@ -39,3 +39,4 @@ pthread_key_delete (pthread_key_t key) return result; } +weak_alias (__pthread_key_delete, pthread_key_delete) diff --git a/nptl/pthread_mutex_destroy.c b/nptl/pthread_mutex_destroy.c index a300832..ed3b63f 100644 --- a/nptl/pthread_mutex_destroy.c +++ b/nptl/pthread_mutex_destroy.c @@ -36,5 +36,5 @@ __pthread_mutex_destroy (pthread_mutex_t *mutex) return 0; } -strong_alias (__pthread_mutex_destroy, pthread_mutex_destroy) +weak_alias (__pthread_mutex_destroy, pthread_mutex_destroy) hidden_def (__pthread_mutex_destroy) diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c index 138e144..6f2fc80 100644 --- a/nptl/pthread_mutex_init.c +++ b/nptl/pthread_mutex_init.c @@ -144,5 +144,5 @@ __pthread_mutex_init (pthread_mutex_t *mutex, return 0; } -strong_alias (__pthread_mutex_init, pthread_mutex_init) +weak_alias (__pthread_mutex_init, pthread_mutex_init) hidden_def (__pthread_mutex_init) diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c index dc9ca4c..b76475b 100644 --- a/nptl/pthread_mutex_lock.c +++ b/nptl/pthread_mutex_lock.c @@ -597,7 +597,7 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex) return 0; } #ifndef __pthread_mutex_lock -strong_alias (__pthread_mutex_lock, pthread_mutex_lock) +weak_alias (__pthread_mutex_lock, pthread_mutex_lock) hidden_def (__pthread_mutex_lock) #endif diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c index a4beb7b..be53381 100644 --- a/nptl/pthread_mutex_timedlock.c +++ b/nptl/pthread_mutex_timedlock.c @@ -41,8 +41,8 @@ #endif int -pthread_mutex_timedlock (pthread_mutex_t *mutex, - const struct timespec *abstime) +__pthread_mutex_timedlock (pthread_mutex_t *mutex, + const struct timespec *abstime) { int oldval; pid_t id = THREAD_GETMEM (THREAD_SELF, tid); @@ -634,3 +634,4 @@ pthread_mutex_timedlock (pthread_mutex_t *mutex, out: return result; } +weak_alias (__pthread_mutex_timedlock, pthread_mutex_timedlock) diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c index e514997..ec7da61 100644 --- a/nptl/pthread_mutex_trylock.c +++ b/nptl/pthread_mutex_trylock.c @@ -403,6 +403,7 @@ __pthread_mutex_trylock (pthread_mutex_t *mutex) #ifndef __pthread_mutex_trylock #ifndef pthread_mutex_trylock -strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock) +weak_alias (__pthread_mutex_trylock, pthread_mutex_trylock) +hidden_def (__pthread_mutex_trylock) #endif #endif diff --git a/nptl/pthread_mutex_unlock.c b/nptl/pthread_mutex_unlock.c index f701d4e..e1a8a5c 100644 --- a/nptl/pthread_mutex_unlock.c +++ b/nptl/pthread_mutex_unlock.c @@ -346,5 +346,5 @@ __pthread_mutex_unlock (pthread_mutex_t *mutex) { return __pthread_mutex_unlock_usercnt (mutex, 1); } -strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock) +weak_alias (__pthread_mutex_unlock, pthread_mutex_unlock) hidden_def (__pthread_mutex_unlock) diff --git a/nptl/pthread_mutexattr_init.c b/nptl/pthread_mutexattr_init.c index 210d490..dcad522 100644 --- a/nptl/pthread_mutexattr_init.c +++ b/nptl/pthread_mutexattr_init.c @@ -33,4 +33,5 @@ __pthread_mutexattr_init (pthread_mutexattr_t *attr) return 0; } -strong_alias (__pthread_mutexattr_init, pthread_mutexattr_init) +weak_alias (__pthread_mutexattr_init, pthread_mutexattr_init) +hidden_def (__pthread_mutexattr_init) diff --git a/nptl/pthread_mutexattr_settype.c b/nptl/pthread_mutexattr_settype.c index 8c4d11f..988793b 100644 --- a/nptl/pthread_mutexattr_settype.c +++ b/nptl/pthread_mutexattr_settype.c @@ -40,4 +40,5 @@ __pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind) return 0; } weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_setkind_np) -strong_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype) +weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype) +hidden_def (__pthread_mutexattr_settype) diff --git a/nptl/pthread_self.c b/nptl/pthread_self.c index 4c978e1..8e21775 100644 --- a/nptl/pthread_self.c +++ b/nptl/pthread_self.c @@ -25,4 +25,4 @@ __pthread_self (void) { return (pthread_t) THREAD_SELF; } -strong_alias (__pthread_self, pthread_self) +weak_alias (__pthread_self, pthread_self) diff --git a/nptl/pthread_setspecific.c b/nptl/pthread_setspecific.c index c5416a5..214af3b 100644 --- a/nptl/pthread_setspecific.c +++ b/nptl/pthread_setspecific.c @@ -89,5 +89,5 @@ __pthread_setspecific (pthread_key_t key, const void *value) return 0; } -strong_alias (__pthread_setspecific, pthread_setspecific) +weak_alias (__pthread_setspecific, pthread_setspecific) hidden_def (__pthread_setspecific) diff --git a/nptl/tpp.c b/nptl/tpp.c index 57eb026..7eb2b96 100644 --- a/nptl/tpp.c +++ b/nptl/tpp.c @@ -43,9 +43,9 @@ void __init_sched_fifo_prio (void) { atomic_store_relaxed (&__sched_fifo_max_prio, - sched_get_priority_max (SCHED_FIFO)); + __sched_get_priority_max (SCHED_FIFO)); atomic_store_relaxed (&__sched_fifo_min_prio, - sched_get_priority_min (SCHED_FIFO)); + __sched_get_priority_min (SCHED_FIFO)); } int diff --git a/posix/nanosleep.c b/posix/nanosleep.c index 60a93ca..dbda103 100644 --- a/posix/nanosleep.c +++ b/posix/nanosleep.c @@ -29,5 +29,5 @@ __nanosleep (const struct timespec *requested_time, } stub_warning (nanosleep) -libc_hidden_def (__nanosleep) +hidden_def (__nanosleep) weak_alias (__nanosleep, nanosleep) diff --git a/sysdeps/posix/gethostname.c b/sysdeps/posix/gethostname.c index 03a5d3f..a132482 100644 --- a/sysdeps/posix/gethostname.c +++ b/sysdeps/posix/gethostname.c @@ -29,7 +29,7 @@ __gethostname (char *name, size_t len) struct utsname buf; size_t node_len; - if (uname (&buf)) + if (__uname (&buf)) return -1; node_len = strlen (buf.nodename) + 1; diff --git a/sysdeps/unix/sysv/linux/i386/Versions b/sysdeps/unix/sysv/linux/i386/Versions index f3544ac..b59ace4 100644 --- a/sysdeps/unix/sysv/linux/i386/Versions +++ b/sysdeps/unix/sysv/linux/i386/Versions @@ -46,6 +46,6 @@ libc { fallocate64; } GLIBC_PRIVATE { - __modify_ldt; + __modify_ldt; __uname; } } diff --git a/sysdeps/unix/sysv/linux/i386/smp.h b/sysdeps/unix/sysv/linux/i386/smp.h index 7d1a7f2..3109ea9 100644 --- a/sysdeps/unix/sysv/linux/i386/smp.h +++ b/sysdeps/unix/sysv/linux/i386/smp.h @@ -36,7 +36,7 @@ is_smp_system (void) char *cp; /* Try reading the number using `sysctl' first. */ - if (uname (&u.uts) == 0) + if (__uname (&u.uts) == 0) cp = u.uts.version; else { diff --git a/sysdeps/unix/sysv/linux/mmap.c b/sysdeps/unix/sysv/linux/mmap.c index b1f229f..98c2f88 100644 --- a/sysdeps/unix/sysv/linux/mmap.c +++ b/sysdeps/unix/sysv/linux/mmap.c @@ -47,5 +47,6 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset) #endif } weak_alias (__mmap, mmap) +libc_hidden_def (__mmap) #endif /* __OFF_T_MATCHES_OFF64_T */ diff --git a/sysdeps/unix/sysv/linux/mmap64.c b/sysdeps/unix/sysv/linux/mmap64.c index d3ea279..e8d519b 100644 --- a/sysdeps/unix/sysv/linux/mmap64.c +++ b/sysdeps/unix/sysv/linux/mmap64.c @@ -53,8 +53,10 @@ __mmap64 (void *addr, size_t len, int prot, int flags, int fd, off64_t offset) #endif } weak_alias (__mmap64, mmap64) +libc_hidden_def (__mmap64) #ifdef __OFF_T_MATCHES_OFF64_T weak_alias (__mmap64, mmap) weak_alias (__mmap64, __mmap) +libc_hidden_def (__mmap) #endif diff --git a/sysdeps/unix/sysv/linux/powerpc/ioctl.c b/sysdeps/unix/sysv/linux/powerpc/ioctl.c index e2e3d33..1437d1d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/ioctl.c +++ b/sysdeps/unix/sysv/linux/powerpc/ioctl.c @@ -41,15 +41,15 @@ __ioctl (int fd, unsigned long int request, ...) break; case TCSETS: - result = tcsetattr (fd, TCSANOW, (struct termios *) arg); + result = __tcsetattr (fd, TCSANOW, (struct termios *) arg); break; case TCSETSW: - result = tcsetattr (fd, TCSADRAIN, (struct termios *) arg); + result = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); break; case TCSETSF: - result = tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); + result = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); break; default: diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c index c7d1d65..49acd16 100644 --- a/sysdeps/unix/sysv/linux/tcsetattr.c +++ b/sysdeps/unix/sysv/linux/tcsetattr.c @@ -41,7 +41,7 @@ /* Set the state of FD to *TERMIOS_P. */ int -tcsetattr (int fd, int optional_actions, const struct termios *termios_p) +__tcsetattr (int fd, int optional_actions, const struct termios *termios_p) { struct __kernel_termios k_termios; unsigned long int cmd; @@ -77,4 +77,5 @@ tcsetattr (int fd, int optional_actions, const struct termios *termios_p) return INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); } +weak_alias (__tcsetattr, tcsetattr) libc_hidden_def (tcsetattr) From patchwork Wed May 10 18:40:54 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: 99016 Delivered-To: patch@linaro.org Received: by 10.182.142.97 with SMTP id rv1csp335970obb; Wed, 10 May 2017 11:42:40 -0700 (PDT) X-Received: by 10.84.231.23 with SMTP id f23mr9999720plk.58.1494441760564; Wed, 10 May 2017 11:42:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494441760; cv=none; d=google.com; s=arc-20160816; b=xKsga1Kg0qnFZMBfy949HKCH1hsJEOnwxHPqB496he5si65X1ZMYYBQkRXQpSXjzRo JKjNoFyrEJFAKfgCpCTOPH8udp1/5mtr/G9uvSENS73eU2d2FttHNJuN5RuzElscHXP0 FpvW4o1qduBK4t6VTRKzXk739LyIpufl+heDi3RG7/0hrXdFUFqA+I8/hxCMCjGUZV4q nAEUSvZ0PxPaIdqtBdA71RGTzlpNyGN3xTs9UvxjuZN0YNfaBbicJ7VsMBOBYzbzHxXR S998M2b7K8tv+JC2JWUVhi9+mmu2ZZlSF+y3cKbYRCDt9Vz7K/xIw8q2a49UmgtzLoEF jUjQ== 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=HPXYrs8grVWvtzfPED8gTt2lYCkERCXDvL33JBxP9RM=; b=BND7F4RT+1M+eX3NCPtuh3SGJIPL3IhYOgCQs8ONO6pwJWlQZy3nGafRBafYylwAOm l6bip78K18Eu/ZuJkXZy6O9oJAvMBJu9q2ZaGYobCqOkbc+6yFoZ5NxGZcLWADkbeTh+ 28xZ5u2OZsaP6yKUw0NUVBSGToNMZv/ethBQEmze/o4pouUReqKW/HaTO84UtqhjDPN2 UZZ7xF5pfatNpVc86+OL9Aw5FqrgFtw5bo15u0b4/8EgRHymWs+0sarBz6NwHtMPyExu /zN3QEcZPeyrsng3NDAIUSW21l/uI3ua1QiYSU1ZK60XsqXyfSoL5s6XcaH6A1IQ9o0i 9OYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-79234-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79234-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 r9si3808602plj.158.2017.05.10.11.42.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 May 2017 11:42:40 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-79234-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-79234-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79234-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=AxXFopBJDqSU6ddMiuC8YsdjuYWfvF8 vK/+HB5L+RX/b9EnjF9xZrQKI5n8+8LIb+YYOzm4DBrTkzh8PXiE5d4G00BtdE2C Cu6grRogEBmOIuMWwVfWYaBuzF5gpkSzR9yvik8JaEbavdefvrLfW0m98lMFmLXK zJ2EOQqPRDxo= 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=WbA+OQRzv7uSBuHTXn/8yn4EnEg=; b=r/tyK E7l5hsDfn3pq1NPd/Mrzhbr94ASDk3v4jodVObfS712KhWi1WP4Y5QvGZUr0qxFr C0e4yD87boS4OPXXTQcSDBbp57hg3l1grnw9CWAUt0QcGEGzsRDKx66vp6u6Rwmt 2SeFYV86UeY/9euzSBo9OxOfDwUXwkFmuejARQ= Received: (qmail 110496 invoked by alias); 10 May 2017 18:41: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 110443 invoked by uid 89); 10 May 2017 18:41:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL, 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=crypt, 10646 X-HELO: mail-qt0-f169.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=HPXYrs8grVWvtzfPED8gTt2lYCkERCXDvL33JBxP9RM=; b=OW/b8bRuZtKBFwGc1iTWqVRdq5XK8xJso9yOkoP3VPN3/eBixH5mbB4rhgddYYrmfW 949cB3DEftXbdDdiALGpqKc5V4qg+0PYu5SdxOuQ92AhSAL3OF+HnTIjHBXSl8QHWpHg Bb7vTwND8YQWBZIm7Sjhmje/Qf6SAGcQruLStVXzEdI/XbGh2hZGanlYkgR1t8wG/N7u ggnDbRE1hCtrjhTeCejbGrjs+tCByGB66RYeOX5WoiY1CHiLAc0DL/ATR4u1MppNLOTX feFAzr9Z5x7++wj7nDCgoQygyLiMxwdNRt9IqsciXlbIDe/RnEXI/T7Vk5YWxaIYLE6h 18xg== X-Gm-Message-State: AODbwcAD+poHViEH67L+sc/qVHrjetctK3xH3a3OhRB+slTH6pHtQlB7 Nnq5v83NHpLOo8btKSU5tw== X-Received: by 10.237.59.20 with SMTP id p20mr3526592qte.95.1494441667855; Wed, 10 May 2017 11:41:07 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v4 2/4] Add C11 threads support Date: Wed, 10 May 2017 15:40:54 -0300 Message-Id: <1494441656-1212-3-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> References: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds C11 threads support (ISO/IEC 9899:2011) based on the public available n1570 [1]. Since I do not have access to the official ISO documentation I would ask if there any deviation from the draft to final doc regarding threads.h please let me know. However based on Joseph's comments on a old thread [2] I would expect to N1570 and final standart to not have any technical differences. Mostly of the definition required are defined based on POSIX counterparts, such as thrd_t (pthread_t), once_flag (pthread_once_t), tss_t (pthread_key_t). The mut_t and cnd_t is also based on internal pthreads 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 it possible to share POSIX internal implementation for mostly of the code making adjust where only required. For mostly symbol implementations, direct POSIX pthread internal calls are used with some exceptions: 1. thrd_start uses pthread_create internal implementation, but changes how to actually calls the start routine. This is due the difference in signature between POSIX and C11, where former return a 'void *' and latter 'int'. To avoid calling convention issues due 'void *' to int cast, routines from C11 threads are started slight different than default pthread one. Explicit cast to expected return are used internally on pthread_create and the result is stored back to void also with an explicit cast. 2. thrd_sleep uses nanosleep internal direct syscall to avoid clobbering errno and to handle expected standard return codes. 3. thrd_yield also uses internal direct syscall to avoid errno clobbering. 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. [1] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf [2] https://sourceware.org/ml/libc-alpha/2011-12/msg00060.html * conform/Makefile (conformtest-headers-ISO11): Add threads.h. (linknamespace-libs-ISO11): Add libpthread.a. * include/stdc-predef.h (__STDC_NO_THREADS__): Remove definition. * nptl/Makefile (headers): Add threads.h. (libpthread-routines): Add new C11 thread objects. * nptl/Versions (libpthread) [GLIBC_2.25]): Add C11 thread symbols. * conform/data/threads.h-data: New file. * nptl/call_once.c: Likewise. * nptl/cnd_broadcast.c: Likewise. * nptl/cnd_destroy.c: Likewise. * nptl/cnd_init.c: Likewise. * nptl/cnd_signal.c: Likewise. * nptl/cnd_timedwait.c: Likewise. * nptl/cnd_wait.c: Likewise. * nptl/mtx_destroy.c: Likewise. * 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. * nptl/thrd_create.c: Likewise. * nptl/thrd_current.c: Likewise. * nptl/thrd_detach.c: Likewise. * nptl/thrd_equal.c: Likewise. * nptl/thrd_exit.c: Likewise. * nptl/thrd_join.c: Likewise. * nptl/thrd_priv.h: Likewise. * nptl/thrd_sleep.c: Likewise. * nptl/thrd_yield.c: Likewise. * nptl/tss_create.c: Likewise. * nptl/tss_delete.c: Likewise. * nptl/tss_get.c: Likewise. * nptl/tss_set.c: Likewise. * nptl/descr.h (pthread): Add c11 field. * nptl/pthreadP.h (ATTR_C11_THREAD): New define. * nptl/pthread_create.c (START_THREAD_DEFN): Call C11 thread start routine with expected function prototype. (__pthread_create_2_1): Add C11 threads check based on attribute value. * sysdeps/nptl/threads.h: New file. * sysdeps/aarch64/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): New define. * sysdeps/alpha/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/arm/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/hppa/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/ia64/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/m68k/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/microblaze/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/mips/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/nios2/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/powerpc/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/s390/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/sh/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/sparc/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/tile/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/x86/nptl/bits/thread-shared-types.h (ONCE_FLAG_ALIGN): Likewise. * sysdeps/nacl/libpthread.abilist: Add C11 thread symbols. * sysdeps/unix/sysv/linux/aarch64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/alpha/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/arm/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/hppa/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/i386/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/ia64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/microblaze/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/nios2/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist: Likewise. * sysdpes/unix/sysv/linux/s390/s390-32/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/tile/tilepro/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist: Likewise. --- ChangeLog | 106 +++++++++++ NEWS | 9 + conform/Makefile | 7 +- conform/data/threads.h-data | 56 ++++++ include/stdc-predef.h | 3 - nptl/Makefile | 12 +- nptl/Versions | 16 ++ nptl/call_once.c | 27 +++ nptl/cnd_broadcast.c | 28 +++ nptl/cnd_destroy.c | 28 +++ nptl/cnd_init.c | 27 +++ nptl/cnd_signal.c | 28 +++ nptl/cnd_timedwait.c | 31 ++++ nptl/cnd_wait.c | 28 +++ nptl/descr.h | 2 + nptl/mtx_destroy.c | 27 +++ nptl/mtx_init.c | 48 +++++ nptl/mtx_lock.c | 28 +++ nptl/mtx_timedlock.c | 31 ++++ nptl/mtx_trylock.c | 29 +++ nptl/mtx_unlock.c | 28 +++ nptl/pthreadP.h | 3 + nptl/pthread_create.c | 18 +- nptl/thrd_create.c | 30 +++ nptl/thrd_current.c | 26 +++ nptl/thrd_detach.c | 30 +++ nptl/thrd_equal.c | 26 +++ nptl/thrd_exit.c | 27 +++ nptl/thrd_join.c | 32 ++++ nptl/thrd_priv.h | 46 +++++ nptl/thrd_sleep.c | 41 +++++ nptl/thrd_yield.c | 29 +++ nptl/tss_create.c | 29 +++ nptl/tss_delete.c | 27 +++ nptl/tss_get.c | 27 +++ nptl/tss_set.c | 28 +++ sysdeps/nacl/libpthread.abilist | 26 +++ sysdeps/nptl/threads.h | 204 +++++++++++++++++++++ sysdeps/unix/sysv/linux/aarch64/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/alpha/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/arm/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/hppa/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/i386/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/ia64/libpthread.abilist | 26 +++ .../sysv/linux/m68k/coldfire/libpthread.abilist | 26 +++ .../unix/sysv/linux/m68k/m680x0/libpthread.abilist | 26 +++ .../unix/sysv/linux/microblaze/libpthread.abilist | 26 +++ .../unix/sysv/linux/mips/mips32/libpthread.abilist | 26 +++ .../unix/sysv/linux/mips/mips64/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/nios2/libpthread.abilist | 26 +++ .../linux/powerpc/powerpc32/libpthread.abilist | 26 +++ .../linux/powerpc/powerpc64/libpthread-le.abilist | 26 +++ .../linux/powerpc/powerpc64/libpthread.abilist | 26 +++ .../sysv/linux/s390/s390-32/libpthread.abilist | 26 +++ .../sysv/linux/s390/s390-64/libpthread.abilist | 26 +++ sysdeps/unix/sysv/linux/sh/libpthread.abilist | 26 +++ .../sysv/linux/sparc/sparc32/libpthread.abilist | 26 +++ .../sysv/linux/sparc/sparc64/libpthread.abilist | 26 +++ .../linux/tile/tilegx/tilegx32/libpthread.abilist | 26 +++ .../linux/tile/tilegx/tilegx64/libpthread.abilist | 26 +++ .../sysv/linux/tile/tilepro/libpthread.abilist | 26 +++ .../unix/sysv/linux/x86_64/64/libpthread.abilist | 26 +++ .../unix/sysv/linux/x86_64/x32/libpthread.abilist | 26 +++ 63 files changed, 1888 insertions(+), 10 deletions(-) create mode 100644 conform/data/threads.h-data create mode 100644 nptl/call_once.c create mode 100644 nptl/cnd_broadcast.c create mode 100644 nptl/cnd_destroy.c create mode 100644 nptl/cnd_init.c create mode 100644 nptl/cnd_signal.c create mode 100644 nptl/cnd_timedwait.c create mode 100644 nptl/cnd_wait.c 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 create mode 100644 nptl/thrd_create.c create mode 100644 nptl/thrd_current.c create mode 100644 nptl/thrd_detach.c create mode 100644 nptl/thrd_equal.c create mode 100644 nptl/thrd_exit.c create mode 100644 nptl/thrd_join.c create mode 100644 nptl/thrd_priv.h create mode 100644 nptl/thrd_sleep.c create mode 100644 nptl/thrd_yield.c 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 create mode 100644 sysdeps/nptl/threads.h -- 2.7.4 diff --git a/NEWS b/NEWS index 09c302b..eb2d5f7 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,15 @@ Version 2.26 * The obsolete header file has been removed. +* C11 threads support (ISO/IEC 9899:2011): fully support of threads + (thrd_create, thrd_equal, thrd_current, thrd_sleep, thrd_yield, thrd_exit, + thrd_detach, and thrd_join), mutual exclusion (mtx_init, mtx_lock, + mtx_timedlock, mtx_trylock, mtx_unlock, and mtx_destroy), conditional + variable (cnd_init, cnd_signal, cnd_broadcast, cnd_wait, cnd_timedwait, + and cnd_destroy), thread-local storage (tss_create, tss_get, tss_set, and + tss_delete) function. Current support is based on POSIX thread functions, + so both standards use a common underlying code. + Security related changes: * The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes, diff --git a/conform/Makefile b/conform/Makefile index 63556b5..a79415f 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -34,9 +34,9 @@ conformtest-headers-ISO := assert.h ctype.h errno.h float.h limits.h locale.h \ conformtest-headers-ISO99 := $(conformtest-headers-ISO) complex.h fenv.h \ inttypes.h iso646.h stdbool.h stdint.h tgmath.h \ wchar.h wctype.h -# Missing ISO11 expectations for: stdatomic.h threads.h. +# Missing ISO11 expectations for: stdatomic.h conformtest-headers-ISO11 := $(conformtest-headers-ISO99) stdalign.h \ - stdnoreturn.h uchar.h + stdnoreturn.h uchar.h threads.h conformtest-headers-POSIX := $(conformtest-headers-ISO) aio.h dirent.h \ fcntl.h fnmatch.h glob.h grp.h mqueue.h \ pthread.h pwd.h regex.h sched.h semaphore.h \ @@ -215,7 +215,8 @@ linknamespace-libs-xsi = $(linknamespace-libs-posix) \ $(common-objpfx)crypt/libcrypt.a linknamespace-libs-ISO = $(linknamespace-libs-isoc) linknamespace-libs-ISO99 = $(linknamespace-libs-isoc) -linknamespace-libs-ISO11 = $(linknamespace-libs-isoc) +linknamespace-libs-ISO11 = $(linknamespace-libs-isoc) \ + $(common-objpfx)nptl/libpthread.a linknamespace-libs-XPG4 = $(linknamespace-libs-isoc) \ $(common-objpfx)crypt/libcrypt.a linknamespace-libs-XPG42 = $(linknamespace-libs-XPG4) diff --git a/conform/data/threads.h-data b/conform/data/threads.h-data new file mode 100644 index 0000000..a4a0ac1 --- /dev/null +++ b/conform/data/threads.h-data @@ -0,0 +1,56 @@ +#if defined ISO11 + +macro ONCE_FLAG_INIT +macro thread_local +macro TSS_DTOR_ITERATIONS + +constant thrd_success +constant thrd_busy +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 +type cnd_t +type once_flag +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) +function thrd_t thrd_current (void) +function int thrd_sleep (const struct timespec*, struct timespec*) +function void thrd_exit (int) +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*) + +function void call_once (once_flag*, void (*)(void)) +function int cnd_init (cnd_t*) +function int cnd_signal (cnd_t*) +function int cnd_broadcast (cnd_t*) +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/include/stdc-predef.h b/include/stdc-predef.h index a2e148c..94ed385 100644 --- a/include/stdc-predef.h +++ b/include/stdc-predef.h @@ -56,7 +56,4 @@ see https://www.iso.org/obp/ui/#iso:std:iso-iec:10646:ed-4:v1:amd:2:v1:en) */ #define __STDC_ISO_10646__ 201605L -/* We do not support C11 . */ -#define __STDC_NO_THREADS__ 1 - #endif diff --git a/nptl/Makefile b/nptl/Makefile index 6d48c0c..d28dbba 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -22,7 +22,7 @@ subdir := nptl include ../Makeconfig -headers := pthread.h semaphore.h bits/semaphore.h +headers := pthread.h semaphore.h bits/semaphore.h threads.h extra-libs := libpthread extra-libs-others := $(extra-libs) @@ -138,7 +138,15 @@ libpthread-routines = nptl-init vars events version pt-interp \ pthread_mutex_getprioceiling \ pthread_mutex_setprioceiling \ pthread_setname pthread_getname \ - pthread_setattr_default_np pthread_getattr_default_np + pthread_setattr_default_np pthread_getattr_default_np \ + pthread_setattr_default_np pthread_getattr_default_np \ + thrd_create thrd_current thrd_detach thrd_equal \ + thrd_exit thrd_join thrd_sleep thrd_yield \ + call_once cnd_broadcast cnd_destroy cnd_init \ + cnd_signal cnd_timedwait cnd_wait \ + mtx_destroy mtx_init mtx_lock mtx_timedlock \ + mtx_trylock mtx_unlock \ + 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 0ae5def..6e1be0c 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -265,6 +265,22 @@ libpthread { GLIBC_2.22 { } + # C11 thread symbols. + GLIBC_2.26 { + thrd_create; thrd_current; + thrd_detach; thrd_equal; + thrd_exit; thrd_join; + thrd_sleep; thrd_yield; + call_once; cnd_broadcast; + cnd_destroy; cnd_init; + cnd_signal; cnd_timedwait; + cnd_wait; mtx_destroy; + mtx_init; mtx_lock; + mtx_timedlock; mtx_trylock; + mtx_unlock; tss_create; + tss_delete; tss_get; tss_set; + }; + GLIBC_PRIVATE { __pthread_initialize_minimal; __pthread_clock_gettime; __pthread_clock_settime; diff --git a/nptl/call_once.c b/nptl/call_once.c new file mode 100644 index 0000000..460e917 --- /dev/null +++ b/nptl/call_once.c @@ -0,0 +1,27 @@ +/* C11 threads call once 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" + +/* Call function func exactly once, even if invoked from several threads. + All calls must be made with the same flag object. */ +void +call_once (once_flag *flag, void (*func)(void)) +{ + __pthread_once (flag, func); +} diff --git a/nptl/cnd_broadcast.c b/nptl/cnd_broadcast.c new file mode 100644 index 0000000..8e5f165 --- /dev/null +++ b/nptl/cnd_broadcast.c @@ -0,0 +1,28 @@ +/* C11 thread conditional broadcast 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" + +/* Unblock all threads currently waiting on condition variable pointed + by cond. */ +int +cnd_broadcast (cnd_t *cond) +{ + int err_code = __pthread_cond_broadcast ((pthread_cond_t*) cond); + return thrd_err_map (err_code); +} diff --git a/nptl/cnd_destroy.c b/nptl/cnd_destroy.c new file mode 100644 index 0000000..4b46132 --- /dev/null +++ b/nptl/cnd_destroy.c @@ -0,0 +1,28 @@ +/* C11 threads conditional destroy 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" +#include "pthreadP.h" + +/* Destroy condition variable pointed by cond and free all of its + resources. */ +void +cnd_destroy (cnd_t *cond) +{ + __pthread_cond_destroy ((pthread_cond_t *) cond); +} diff --git a/nptl/cnd_init.c b/nptl/cnd_init.c new file mode 100644 index 0000000..27cc452 --- /dev/null +++ b/nptl/cnd_init.c @@ -0,0 +1,27 @@ +/* C11 thread conditional initialization 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" + +/* Initialize new condition variable pointed by cond. */ +int +cnd_init (cnd_t *cond) +{ + int err_code = __pthread_cond_init ((pthread_cond_t *)cond, NULL); + return thrd_err_map (err_code); +} diff --git a/nptl/cnd_signal.c b/nptl/cnd_signal.c new file mode 100644 index 0000000..e843957 --- /dev/null +++ b/nptl/cnd_signal.c @@ -0,0 +1,28 @@ +/* C11 threads conditional signal 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" + +/* Unblock one thread that currently waits on condition variable pointed + by cond. */ +int +cnd_signal (cnd_t *cond) +{ + int err_code = __pthread_cond_signal ((pthread_cond_t *) cond); + return thrd_err_map (err_code); +} diff --git a/nptl/cnd_timedwait.c b/nptl/cnd_timedwait.c new file mode 100644 index 0000000..b3c60e8 --- /dev/null +++ b/nptl/cnd_timedwait.c @@ -0,0 +1,31 @@ +/* C11 threads conditional timed wait 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" + +/* Block current thread on the condition variable until condition variable + pointed by cond is signaled or time pointed by time_point is reached. */ +int +cnd_timedwait (cnd_t *restrict cond, mtx_t *restrict mutex, + const struct timespec* restrict time_point) +{ + int err_code = __pthread_cond_timedwait ((pthread_cond_t *) cond, + (pthread_mutex_t *) mutex, + time_point); + return thrd_err_map (err_code); +} diff --git a/nptl/cnd_wait.c b/nptl/cnd_wait.c new file mode 100644 index 0000000..298d049 --- /dev/null +++ b/nptl/cnd_wait.c @@ -0,0 +1,28 @@ +/* C11 threads conditional wait implementaiton. + 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" + +/* Block current thread on the condition variable pointed by cond. */ +int +cnd_wait (cnd_t *cond, mtx_t *mutex) +{ + int err_code = __pthread_cond_wait ((pthread_cond_t *) cond, + (pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/descr.h b/nptl/descr.h index a145860..079bd09 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -373,6 +373,8 @@ struct pthread to the function. */ void *(*start_routine) (void *); void *arg; + /* Indicates whether is a C11 thread created by thrd_creat. */ + bool c11; /* Debug state. */ td_eventbuf_t eventbuf; diff --git a/nptl/mtx_destroy.c b/nptl/mtx_destroy.c new file mode 100644 index 0000000..1fcc534 --- /dev/null +++ b/nptl/mtx_destroy.c @@ -0,0 +1,27 @@ +/* C11 threads mutex destroy 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" +#include "pthreadP.h" + +/* Destroy the mutex object pointed by mutex. */ +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..44ac329 --- /dev/null +++ b/nptl/mtx_init.c @@ -0,0 +1,48 @@ +/* C11 threads mutex initialization 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" + +/* Creates a new mutex object with type type. If successful the new object + is pointed by mutex. */ +int +mtx_init (mtx_t *mutex, int type) +{ + 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..bd4c530 --- /dev/null +++ b/nptl/mtx_lock.c @@ -0,0 +1,28 @@ +/* C11 threads mutex lock 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" + +/* Block the current thread until the mutex pointed to by mutex is + unlocked. In that case current thread will not be blocked. */ +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..3770d5c --- /dev/null +++ b/nptl/mtx_timedlock.c @@ -0,0 +1,31 @@ +/* C11 threads mutex timed lock 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" + +/* 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 unlocked + current thread will not be blocked. */ +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..406229a --- /dev/null +++ b/nptl/mtx_trylock.c @@ -0,0 +1,29 @@ +/* C11 threads mutex try lock 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" + +/* 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. */ +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..d5f9c32 --- /dev/null +++ b/nptl/mtx_unlock.c @@ -0,0 +1,28 @@ +/* C11 threads mutex unlock 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" + +/* Unlock the mutex pointed by mutex. It may potentially awake other + threads waiting on this mutex. */ +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/nptl/pthreadP.h b/nptl/pthreadP.h index 6e7d6ff..54e043c 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -173,6 +173,9 @@ enum #define __PTHREAD_ONCE_DONE 2 #define __PTHREAD_ONCE_FORK_GEN_INCR 4 +/* Attribute to indicate thread creation was issued from C11 thrd_create. */ +#define ATTR_C11_THREAD ((void*)(uintptr_t)-1) + /* Condition variable definitions. See __pthread_cond_wait_common. Need to be defined here so there is one place from which diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 7a970ff..3efb76d 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -461,7 +461,19 @@ START_THREAD_DEFN LIBC_PROBE (pthread_start, 3, (pthread_t) pd, pd->start_routine, pd->arg); /* Run the code the user provided. */ - THREAD_SETMEM (pd, result, pd->start_routine (pd->arg)); + void *ret; + if (pd->c11) + { + /* The function pointer of the c11 thread start is cast to an incorrect + type on __pthread_create_2_1 call, however it is casted back to correct + one so the call behavior is well-defined (it is assumed that pointers + to void are able to represent all values of int. */ + int (*start)(void*) = (int (*) (void*)) pd->start_routine; + ret = (void*) (intptr_t) start (pd->arg); + } + else + ret = pd->start_routine (pd->arg); + THREAD_SETMEM (pd, result, ret); } /* Call destructors for the thread_local TLS variables. */ @@ -637,7 +649,8 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr, const struct pthread_attr *iattr = (struct pthread_attr *) attr; struct pthread_attr default_attr; bool free_cpuset = false; - if (iattr == NULL) + bool c11 = (attr == ATTR_C11_THREAD); + if (iattr == NULL || c11) { lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); default_attr = __default_pthread_attr; @@ -695,6 +708,7 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr, get the information from its thread descriptor. */ pd->start_routine = start_routine; pd->arg = arg; + pd->c11 = c11; /* Copy the thread attribute flags. */ struct pthread *self = THREAD_SELF; diff --git a/nptl/thrd_create.c b/nptl/thrd_create.c new file mode 100644 index 0000000..d304793 --- /dev/null +++ b/nptl/thrd_create.c @@ -0,0 +1,30 @@ +/* C11 threads thread 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 a new thread executing the function func. Arguments to func + are passed through arg. If succesful, thr is set to new thread + identifier. */ +int +thrd_create (thrd_t *thr, thrd_start_t func, void *arg) +{ + int err_code = __pthread_create_2_1 (thr, ATTR_C11_THREAD, + (void* (*) (void*))func, arg); + return thrd_err_map (err_code); +} diff --git a/nptl/thrd_current.c b/nptl/thrd_current.c new file mode 100644 index 0000000..7269d4b --- /dev/null +++ b/nptl/thrd_current.c @@ -0,0 +1,26 @@ +/* C11 threads current thread 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 current thread identifier. */ +thrd_t +thrd_current (void) +{ + return __pthread_self (); +} diff --git a/nptl/thrd_detach.c b/nptl/thrd_detach.c new file mode 100644 index 0000000..187d078 --- /dev/null +++ b/nptl/thrd_detach.c @@ -0,0 +1,30 @@ +/* C11 threads thread detach 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" + +/* Detache the thread identified by thr from the current environment. + It does not allow join or wait for the thread. */ +int +thrd_detach (thrd_t thr) +{ + int err_code; + + err_code = __pthread_detach (thr); + return thrd_err_map (err_code); +} diff --git a/nptl/thrd_equal.c b/nptl/thrd_equal.c new file mode 100644 index 0000000..fcda488 --- /dev/null +++ b/nptl/thrd_equal.c @@ -0,0 +1,26 @@ +/* C11 threads thread equality check 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" + +/* Check if lhs and rhs point to the same thread. */ +int +thrd_equal (thrd_t lhs, thrd_t rhs) +{ + return __pthread_equal (lhs, rhs); +} diff --git a/nptl/thrd_exit.c b/nptl/thrd_exit.c new file mode 100644 index 0000000..a49d8e0 --- /dev/null +++ b/nptl/thrd_exit.c @@ -0,0 +1,27 @@ +/* C11 threads thread exit 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" + +/* Terminate current thread execution, cleaning up any thread local + storage and freeing resources. Returns the value specified in res. */ +_Noreturn void +thrd_exit (int res) +{ + __pthread_exit ((void*)(uintptr_t) res); +} diff --git a/nptl/thrd_join.c b/nptl/thrd_join.c new file mode 100644 index 0000000..1d69918 --- /dev/null +++ b/nptl/thrd_join.c @@ -0,0 +1,32 @@ +/* C11 threads thread join 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" + +/* Block current thread until execution of thr is complete. In case that + res is not NULL, will store the return value of thr when exiting. */ +int +thrd_join (thrd_t thr, int *res) +{ + void *pthread_res; + int err_code = __pthread_join (thr, &pthread_res); + if (res) + *res = (int)((uintptr_t) pthread_res); + + return thrd_err_map (err_code); +} diff --git a/nptl/thrd_priv.h b/nptl/thrd_priv.h new file mode 100644 index 0000000..a431d60 --- /dev/null +++ b/nptl/thrd_priv.h @@ -0,0 +1,46 @@ +/* Internal C11 threads definitions. + 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 + . */ + +#ifndef THRD_PRIV_H +# define THRD_PRIV_H + +#include +#include +#include +#include "pthreadP.h" /* For pthread_{mutex,cond}_t definitions. */ + +/* Maps pthread error codes with thrd error codes. */ +static __always_inline int +thrd_err_map (int err_code) +{ + switch (err_code) + { + case 0: + return thrd_success; + case ENOMEM: + return thrd_nomem; + case ETIMEDOUT: + return thrd_timedout; + case EBUSY: + return thrd_busy; + default: + return thrd_error; + } +} + +#endif diff --git a/nptl/thrd_sleep.c b/nptl/thrd_sleep.c new file mode 100644 index 0000000..a49fdc4 --- /dev/null +++ b/nptl/thrd_sleep.c @@ -0,0 +1,41 @@ +/* C11 threads thread sleep 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" +#include + +/* Block current thread execution for at least the time pointed by time_point. + The current thread may resume if receives a signal. In that case, if + remaining is not NULL, the remaining time is stored in the object pointed + by it. */ +int +thrd_sleep (const struct timespec* time_point, struct timespec* remaining) +{ + INTERNAL_SYSCALL_DECL (err); + int ret = INTERNAL_SYSCALL_CALL (nanosleep, err, time_point, remaining); + if (INTERNAL_SYSCALL_ERROR_P (ret, err)) + { + /* C11 states thrd_sleep function returns -1 if it has been interrupted + by a signal, or a negative value if it fails. */ + ret = INTERNAL_SYSCALL_ERRNO (ret, err); + if (ret == EINTR) + return -1; + return -2; + } + return 0; +} diff --git a/nptl/thrd_yield.c b/nptl/thrd_yield.c new file mode 100644 index 0000000..13a02f3 --- /dev/null +++ b/nptl/thrd_yield.c @@ -0,0 +1,29 @@ +/* C11 threads thread yield 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" + +/* Stop current thread execution and call the scheduler to decide which + thread should execute next. The current thread may be selected by the + scheduler to keep running. */ +void +thrd_yield (void) +{ + INTERNAL_SYSCALL_DECL (err); + INTERNAL_SYSCALL_CALL (sched_yield, err); +} 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/nacl/libpthread.abilist b/sysdeps/nacl/libpthread.abilist index 8f0099c..7d377b5 100644 --- a/sysdeps/nacl/libpthread.abilist +++ b/sysdeps/nacl/libpthread.abilist @@ -173,3 +173,29 @@ GLIBC_2.22 sem_timedwait F GLIBC_2.22 sem_trywait F GLIBC_2.22 sem_unlink F GLIBC_2.22 sem_wait F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/nptl/threads.h b/sysdeps/nptl/threads.h new file mode 100644 index 0000000..86d6eeb --- /dev/null +++ b/sysdeps/nptl/threads.h @@ -0,0 +1,204 @@ +/* ISO C11 Standard: 7.26 - Thread support library . + Copyright (C) 2016 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 + . */ + +#ifndef _THREADS_H +#define _THREADS_H 1 + +#include +#include + +__BEGIN_DECLS + +#include +#include + +#define ONCE_FLAG_INIT 0 +#define thread_local _Thread_local +#define TSS_DTOR_ITERATIONS 4 + +typedef unsigned long int thrd_t; +typedef int __ONCE_ALIGNMENT once_flag; +typedef unsigned int tss_t; +typedef int (*thrd_start_t) (void*); +typedef void (*tss_dtor_t) (void*); + +/* Exit and error codes. */ +enum +{ + thrd_success = 0, + thrd_busy = 1, + thrd_error = 2, + thrd_nomem = 3, + thrd_timedout = 4 +}; + +/* Kinds of mutexes. */ +enum +{ + mtx_plain = 0, + mtx_recursive = 1, + mtx_timed = 2 +}; + +/* Definition of mtx_t based on pthread_mutex_t. */ +typedef union +{ + struct __pthread_mutex_s __data; + char __size[__SIZEOF_PTHREAD_MUTEX_T]; + long int __align; +} mtx_t; + +/* Definition of cnd_t based on pthread_cond_t. */ +typedef union +{ + struct __pthread_cond_s __data; + char __size[__SIZEOF_PTHREAD_COND_T]; + __extension__ long long int __align; +} cnd_t; + + +/* Threads functions. */ + +/* Create a new thread executing the function __func. Arguments to __func + are passed through __arg. If succesful, __thr is set to new thread + identifier. */ +extern int thrd_create (thrd_t *__thr, thrd_start_t __func, void *__arg); + +/* Check if __lhs and __rhs point to the same thread. */ +extern int thrd_equal (thrd_t __lhs, thrd_t __rhs); + +/* Return current thread identifier. */ +extern thrd_t thrd_current (void); + +/* Block current thread execution for at least the time pointed by + __time_point. The current thread may resume if receives a signal. In + that case, if __remaining is not NULL, the remaining time is stored in + the object pointed by it. */ +extern int thrd_sleep (const struct timespec *__time_point, + struct timespec *__remaining); + +/* Terminate current thread execution, cleaning up any thread local + storage and freeing resources. Returns the value specified in __res. */ +extern void thrd_exit (int __res) __attribute__ ((__noreturn__)); + +/* Detache the thread identified by __thr from the current environment. + It does not allow join or wait for __thr. */ +extern int thrd_detach (thrd_t __thr); + +/* Block current thread until execution of __thr is complete. In case that + __res is not NULL, will store the return value of __thr when exiting. */ +extern int thrd_join (thrd_t __thr, int *__res); + +/* Stop current thread execution and call the scheduler to decide which + thread should execute next. The current thread may be selected by the + scheduler to keep running. */ +extern void thrd_yield (void); + + +/* 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); + +/* Call function func exactly once, even if invoked from several threads. + All calls must be made with the same __flag object. */ +extern void call_once (once_flag *__flag, void (*__func)(void)); + + +/* Condition variable functions. */ + +/* Initialize new condition variable pointed by __cond. */ +extern int cnd_init (cnd_t *__cond); + +/* Unblock one thread that currently waits on condition variable pointed + by __cond. */ +extern int cnd_signal (cnd_t *__cond); + +/* Unblock all threads currently waiting on condition variable pointed by + __cond. */ +extern int cnd_broadcast (cnd_t *__cond); + +/* Block current thread on the condition variable pointed by __cond. */ +extern int cnd_wait (cnd_t *__cond, mtx_t *__mutex); + +/* Block current thread on the condition variable until condition variable + pointed by __cond is signaled or time pointed by __time_point is + reached. */ +extern int cnd_timedwait (cnd_t *__restrict __cond, + mtx_t *__restrict __mutex, + const struct timespec *__restrict __time_point); + +/* Destroy condition variable pointed by __cond and free all of its + 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); + +#ifdef __USE_EXTERN_INLINES +/* Optimizations. */ +__extern_inline int +thrd_equal (thrd_t __thread1, thrd_t __thread2) +{ + return __thread1 == __thread2; +} +#endif + +__END_DECLS + +#endif /* _THREADS_H */ diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist index 0cf30ee..c0f6af2 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist @@ -224,3 +224,29 @@ GLIBC_2.17 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist index 7e121d4..bf852a0 100644 --- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist @@ -216,6 +216,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/arm/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/libpthread.abilist index 91545c1..7c39603 100644 --- a/sysdeps/unix/sysv/linux/arm/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/arm/libpthread.abilist @@ -9,6 +9,32 @@ GLIBC_2.12 pthread_setname_np F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _IO_flockfile F GLIBC_2.4 _IO_ftrylockfile F diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist index a73aa43..4d1dbc5 100644 --- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist @@ -204,6 +204,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist index 8f9c325..1e3aeae 100644 --- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist @@ -216,6 +216,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist index d4c8ded..a87669f 100644 --- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist @@ -204,6 +204,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist index 91545c1..7c39603 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist @@ -9,6 +9,32 @@ GLIBC_2.12 pthread_setname_np F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _IO_flockfile F GLIBC_2.4 _IO_ftrylockfile F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist index 8f9c325..1e3aeae 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist @@ -216,6 +216,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist index 00d948b..07e3831 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist @@ -223,3 +223,29 @@ GLIBC_2.18 vfork F GLIBC_2.18 wait F GLIBC_2.18 waitpid F GLIBC_2.18 write F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist index 280d99d..53d3d1c 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist @@ -213,6 +213,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist index ad55bdd..7aabe95 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist @@ -213,6 +213,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist index a10bbde..c117ce5 100644 --- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist @@ -221,3 +221,29 @@ GLIBC_2.21 tcdrain F GLIBC_2.21 wait F GLIBC_2.21 waitpid F GLIBC_2.21 write F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist index 14c3a86..160b523 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist @@ -216,6 +216,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist index 0cf30ee..475ecd6 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist @@ -224,3 +224,29 @@ GLIBC_2.17 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 call_once F +GLIBC_2.25 cnd_broadcast F +GLIBC_2.25 cnd_destroy F +GLIBC_2.25 cnd_init F +GLIBC_2.25 cnd_signal F +GLIBC_2.25 cnd_timedwait F +GLIBC_2.25 cnd_wait F +GLIBC_2.25 mtx_destroy F +GLIBC_2.25 mtx_init F +GLIBC_2.25 mtx_lock F +GLIBC_2.25 mtx_timedlock F +GLIBC_2.25 mtx_trylock F +GLIBC_2.25 mtx_unlock F +GLIBC_2.25 thrd_create F +GLIBC_2.25 thrd_current F +GLIBC_2.25 thrd_detach F +GLIBC_2.25 thrd_equal F +GLIBC_2.25 thrd_exit F +GLIBC_2.25 thrd_join F +GLIBC_2.25 thrd_sleep F +GLIBC_2.25 thrd_yield F +GLIBC_2.25 tss_create F +GLIBC_2.25 tss_delete F +GLIBC_2.25 tss_get F +GLIBC_2.25 tss_set F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist index 464b91a..7881e7b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist @@ -9,6 +9,32 @@ GLIBC_2.12 pthread_setname_np F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 _IO_flockfile F GLIBC_2.3 _IO_ftrylockfile F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist index 3c5e11a..0a98f27 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist @@ -219,6 +219,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist index 83a1fcd..c3fe23b 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist @@ -207,6 +207,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/sh/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/libpthread.abilist index a73aa43..4d1dbc5 100644 --- a/sysdeps/unix/sysv/linux/sh/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/sh/libpthread.abilist @@ -204,6 +204,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist index 7e121d4..bf852a0 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist @@ -216,6 +216,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist index d4c8ded..a87669f 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist @@ -204,6 +204,32 @@ GLIBC_2.2.3 GLIBC_2.2.3 A GLIBC_2.2.3 pthread_getattr_np F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libpthread.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libpthread.abilist index d16158f..1e538e8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libpthread.abilist @@ -224,3 +224,29 @@ GLIBC_2.12 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libpthread.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libpthread.abilist index d16158f..1e538e8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libpthread.abilist @@ -224,3 +224,29 @@ GLIBC_2.12 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libpthread.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libpthread.abilist index d16158f..1e538e8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libpthread.abilist @@ -224,3 +224,29 @@ GLIBC_2.12 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist index 85365c0..2395f5d 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist @@ -203,6 +203,32 @@ GLIBC_2.2.5 waitpid F GLIBC_2.2.5 write F GLIBC_2.2.6 GLIBC_2.2.6 A GLIBC_2.2.6 __nanosleep F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F GLIBC_2.3.2 GLIBC_2.3.2 A GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist index 6cd0fc3..42a39db 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist @@ -224,3 +224,29 @@ GLIBC_2.16 write F GLIBC_2.18 GLIBC_2.18 A GLIBC_2.18 pthread_getattr_default_np F GLIBC_2.18 pthread_setattr_default_np F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 call_once F +GLIBC_2.26 cnd_broadcast F +GLIBC_2.26 cnd_destroy F +GLIBC_2.26 cnd_init F +GLIBC_2.26 cnd_signal F +GLIBC_2.26 cnd_timedwait F +GLIBC_2.26 cnd_wait F +GLIBC_2.26 mtx_destroy F +GLIBC_2.26 mtx_init F +GLIBC_2.26 mtx_lock F +GLIBC_2.26 mtx_timedlock F +GLIBC_2.26 mtx_trylock F +GLIBC_2.26 mtx_unlock F +GLIBC_2.26 thrd_create F +GLIBC_2.26 thrd_current F +GLIBC_2.26 thrd_detach F +GLIBC_2.26 thrd_equal F +GLIBC_2.26 thrd_exit F +GLIBC_2.26 thrd_join F +GLIBC_2.26 thrd_sleep F +GLIBC_2.26 thrd_yield F +GLIBC_2.26 tss_create F +GLIBC_2.26 tss_delete F +GLIBC_2.26 tss_get F +GLIBC_2.26 tss_set F From patchwork Wed May 10 18:40:55 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: 99015 Delivered-To: patch@linaro.org Received: by 10.182.142.97 with SMTP id rv1csp335869obb; Wed, 10 May 2017 11:42:17 -0700 (PDT) X-Received: by 10.99.117.66 with SMTP id f2mr8149131pgn.58.1494441737452; Wed, 10 May 2017 11:42:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494441737; cv=none; d=google.com; s=arc-20160816; b=ZXQl5ci0vRhcGDJQWT54G96eKrRg1E7+1Wx3gizlmswuTvKoL/4acf7qbZLazQSzcb p0XBzSL9SLqo6qigT5SeevCcKOb8L1G36BrxlecvgbyUIKlyMUj7I9r8L/RpJA9BB9bj okSOepr27moyJ26D1Y2bdbUTEhan6wlVEihEfHE7/SNolqfTMOpQfVF37hP0Cx2Z0+qt zWgB+nfW6WGMgiMQd06LtDfPmNHDngyzQyxBad5E2Pb2a4QiBIb1xOF9zjbe4aTfSgVP prpxcATT0Qk9A/9RqAF9bhcc/9hs/AHlKta19uDevQTKhmuK07hvXedAmW9X22VBAqeu 6Bpw== 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=Kg3xHmXVUz5uSzSHviMjdDWmk7bIYaHaZmXQExkdT4s=; b=J6ML2462aMWGqFIVg3/yNW1u8Z/3gDI/uoT1IoJqBZE0dOQCiVLZcyR8At5nuWovix X08GFEiZWGzwry7MgLcOqlK58xpocVE/e9Rhn4VETzdWn9OwsVk6j/hEwJrjVkG/1bHj 7AGvcqoT4yNDi5HQTcaWQAHi5FDktURk1SmbOdZ+mAxtvqziCRIFed/jL+j2xe/fGL4c qd+Df1E232VCU0t4FAvyUvu1uU/iEPmh1nqHRe9tW6Ay03AYUjZ0hYUUO0IVCPDiUMkK kJU+SgQmQFZAlWvfbSOeVOiprdprR+cWtDPyKYK7ur1DtmwKyObLR7OnbdxD2wTXqje6 JUpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-79233-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79233-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 w12si3835552pls.199.2017.05.10.11.42.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 May 2017 11:42:17 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-79233-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-79233-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79233-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=LQQz0Ckq/yB1JI2l4rt7+Bfefjl3glP s+zzQq/6uuKaa9K3kHdLNosIS0MPPGA9jzarvmmpZqOOuhkVaE1p/4sjpqP7usat 5OgMrInAFN/pXZ5twSUrYzrH/Rkyr6V+s1DSUHJoQ78QyzJtSkpZp0X3Z8QNk34q J7aOYUN/bHHk= 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=RrAJ8LaUiw45cPRSwe5p8UCHK7A=; b=hQKpA eruXNA8+XKD/W3F/bZYrRFZnToiVqEeuc/9JeViap3E5NKhCeJhbw5cQrFYInTgq aahn/l4eM3RoOjmwFAqTQuOOVvy8H81nT3jrEVT7MmF2fktcv8tJRnDe2u7VaeAz uKUL9uL6o7SrC+sLqRUd6dZfhIRUIHmQkJUfgg= Received: (qmail 108900 invoked by alias); 10 May 2017 18:41:23 -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 108650 invoked by uid 89); 10 May 2017 18:41:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL, 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=150000, Join, Tiny, Juan X-HELO: mail-qt0-f171.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=Kg3xHmXVUz5uSzSHviMjdDWmk7bIYaHaZmXQExkdT4s=; b=bYiecatJJqFfplPQ8hQaf73Me3hKZgmAZ0jhn6jzaG4d+2VIcZNt2PKE+FSQM3J5x2 JBeuaVAY5Ov0MpR+FJpofHN3bv0tYE/vK4+ZZDYpRcrAGe+dGsFuH4xedaC9hUUdJXcw qE8PgNurldr2/gGAJSglemrLM7KKRG4JLrBv0zAUckVhNPeg71NQvlZb8/7yoCEcGXsd mFeDigXkbvtvoo/a0hzPDY7Lh320TqjjVQZvAt1lDkzJ5sb6z29rGAtMxlEuz2TDh5nm 1FLgB6zmheUq4stoRnRgdxFNVQThCnFwYistRne+ia9IlFPkm32u7R9QGteHMCmU8bVr etSQ== X-Gm-Message-State: AODbwcDg6O5wabl9yC/jgJGKXHvf75gDrtEi4zVk93sDGCzzC9u7x1Ib Oi3iIuJYiwBqiSu94dUPbA== X-Received: by 10.200.43.146 with SMTP id m18mr6938947qtm.210.1494441669535; Wed, 10 May 2017 11:41:09 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v4 3/4] Add test cases for ISO C11 threads Date: Wed, 10 May 2017 15:40:55 -0300 Message-Id: <1494441656-1212-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> References: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds to testsuite new test cases to test all new introduced C11 threads functions, types and macros are tested. 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. Adhemerval Zanella Juan Manuel Torres Palma * nptl/Makefile (tests): Add new test files. * nptl/tst-call-once.c : New file. Tests C11 functions and types. * nptl/tst-cnd-basic.c: Likewise. * nptl/tst-cnd-broadcast.c: Likewise. * nptl/tst-cnd-timedwait.c: Likewise. * nptl/tst-mtx-basic.c: Likewise. * nptl/tst-mtx-recursive.c: Likewise. * nptl/tst-mtx-timedlock.c: Likewise. * nptl/tst-mtx-trylock.c: Likewise. * nptl/tst-thrd-basic.c: Likewise. * nptl/tst-thrd-detach.c: Likewise. * nptl/tst-thrd-sleep.c: Likewise. * nptl/tst-tss-basic.c: Likewise. --- ChangeLog | 13 +++++++ nptl/Makefile | 5 ++- nptl/tst-call-once.c | 66 ++++++++++++++++++++++++++++++++ nptl/tst-cnd-basic.c | 68 +++++++++++++++++++++++++++++++++ nptl/tst-cnd-broadcast.c | 83 ++++++++++++++++++++++++++++++++++++++++ nptl/tst-cnd-timedwait.c | 70 ++++++++++++++++++++++++++++++++++ nptl/tst-mtx-basic.c | 73 ++++++++++++++++++++++++++++++++++++ nptl/tst-mtx-recursive.c | 45 ++++++++++++++++++++++ nptl/tst-mtx-timedlock.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ nptl/tst-mtx-trylock.c | 90 ++++++++++++++++++++++++++++++++++++++++++++ nptl/tst-thrd-detach.c | 52 +++++++++++++++++++++++++ nptl/tst-thrd-sleep.c | 51 +++++++++++++++++++++++++ nptl/tst-tss-basic.c | 75 ++++++++++++++++++++++++++++++++++++ 13 files changed, 788 insertions(+), 1 deletion(-) create mode 100644 nptl/tst-call-once.c create mode 100644 nptl/tst-cnd-basic.c create mode 100644 nptl/tst-cnd-broadcast.c create mode 100644 nptl/tst-cnd-timedwait.c create mode 100644 nptl/tst-mtx-basic.c create mode 100644 nptl/tst-mtx-recursive.c create mode 100644 nptl/tst-mtx-timedlock.c create mode 100644 nptl/tst-mtx-trylock.c create mode 100644 nptl/tst-thrd-detach.c create mode 100644 nptl/tst-thrd-sleep.c create mode 100644 nptl/tst-tss-basic.c -- 2.7.4 diff --git a/nptl/Makefile b/nptl/Makefile index d28dbba..15301b3 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -304,7 +304,10 @@ tests = tst-typesizes \ c89 gnu89 c99 gnu99 c11 gnu11) \ tst-bad-schedattr \ tst-thread_local1 tst-mutex-errorcheck tst-robust10 \ - tst-robust-fork tst-create-detached + tst-robust-fork tst-create-detached \ + tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ + tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \ + tst-mtx-recursive tst-tss-basic tst-call-once tst-mtx-timedlock xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \ tst-mutexpp1 tst-mutexpp6 tst-mutexpp10 test-srcs = tst-oddstacklimit diff --git a/nptl/tst-call-once.c b/nptl/tst-call-once.c new file mode 100644 index 0000000..331174e --- /dev/null +++ b/nptl/tst-call-once.c @@ -0,0 +1,66 @@ +/* C11 threads call_once test. + 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 +#include +#include + +#include + +/* Flag that controls the first thread access. */ +static once_flag flag = ONCE_FLAG_INIT; + +static int value = 0; + +static void +do_once (void) +{ + value++; +} + +static int +func (void* data) +{ + call_once (&flag, do_once); + thrd_exit (thrd_success); +} + +#define N 20 + +int +do_test (void) +{ + thrd_t ids[N]; + + for (int i = 0; i < N; ++i) + { + if (thrd_create (&ids[i], func, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + } + + /* Join threads. */ + for (int i = 0; i < N; ++i) + { + if (thrd_join (ids[i], NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + } + + return (value != 1); +} + +#include diff --git a/nptl/tst-cnd-basic.c b/nptl/tst-cnd-basic.c new file mode 100644 index 0000000..56de4d7 --- /dev/null +++ b/nptl/tst-cnd-basic.c @@ -0,0 +1,68 @@ +/* C11 threads condition variable tests. + 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 +#include +#include + +#include + +/* Shared condition variable between child and parent. */ +static cnd_t cond; + +/* Mutex needed to signal and wait threads. */ +static mtx_t mutex; + +static int +signal_parent (void) +{ + if (cnd_signal (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_signal"); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + + if (cnd_init (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_init failed"); + if (mtx_init (&mutex, mtx_plain) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + if (thrd_create (&id, (thrd_start_t) signal_parent, NULL) + != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + if (cnd_wait (&cond, &mutex) != thrd_success) + FAIL_EXIT1 ("cnd_wait failed"); + + /* Joining is not mandatory here, but still done to assure child thread + ends correctly. */ + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + + mtx_destroy (&mutex); + cnd_destroy (&cond); + + return 0; +} + +#include diff --git a/nptl/tst-cnd-broadcast.c b/nptl/tst-cnd-broadcast.c new file mode 100644 index 0000000..1ca87a3 --- /dev/null +++ b/nptl/tst-cnd-broadcast.c @@ -0,0 +1,83 @@ +/* C11 threads condition broadcast variable tests. + 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 +#include +#include + +#include + +/* Condition variable where child threads will wait. */ +static cnd_t cond; + +/* Mutex to control wait on cond. */ +static mtx_t mutex; + +/* Code executed by each thread. */ +static int +child_wait (void* data) +{ + /* Wait until parent thread sends broadcast here. */ + mtx_lock (&mutex); + cnd_wait (&cond, &mutex); + mtx_unlock (&mutex); + + thrd_exit (thrd_success); +} + +#define N 5 + +static int +do_test (void) +{ + thrd_t ids[N]; + unsigned char i; + + if (cnd_init (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_init failed"); + if (mtx_init (&mutex, mtx_plain) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + /* Create N new threads. */ + for (i = 0; i < N; ++i) + { + if (thrd_create (&ids[i], child_wait, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + } + + /* Wait for other threads to reach their wait func. */ + thrd_sleep (&((struct timespec){.tv_sec = 2}), NULL); + + mtx_lock (&mutex); + if (cnd_broadcast (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_broadcast failed"); + mtx_unlock (&mutex); + + for (i = 0; i < N; ++i) + { + if (thrd_join (ids[i], NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + } + + mtx_destroy (&mutex); + cnd_destroy (&cond); + + return 0; +} + +#include diff --git a/nptl/tst-cnd-timedwait.c b/nptl/tst-cnd-timedwait.c new file mode 100644 index 0000000..64a9546 --- /dev/null +++ b/nptl/tst-cnd-timedwait.c @@ -0,0 +1,70 @@ +/* C11 threads condition timed wait variable tests. + 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 +#include +#include + +#include + +/* Shared condition variable between child and parent. */ +static cnd_t cond; + +/* Mutex needed to signal and wait threads. */ +static mtx_t mutex; + +static int +signal_parent (void *arg) +{ + if (cnd_signal (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_signal failed"); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + struct timespec w_time; + + if (cnd_init (&cond) != thrd_success) + FAIL_EXIT1 ("cnd_init failed"); + if (mtx_init (&mutex, mtx_plain) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + if (clock_gettime (CLOCK_REALTIME, &w_time) != 0) + FAIL_EXIT1 ("clock_gettime failed"); + w_time.tv_nsec += 150000; + + if (thrd_create (&id, signal_parent, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + if (cnd_timedwait (&cond, &mutex, &w_time) != thrd_success) + FAIL_EXIT1 ("cnd_timedwait failed"); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + + mtx_destroy (&mutex); + cnd_destroy (&cond); + + return 0; +} + +#include diff --git a/nptl/tst-mtx-basic.c b/nptl/tst-mtx-basic.c new file mode 100644 index 0000000..c064405 --- /dev/null +++ b/nptl/tst-mtx-basic.c @@ -0,0 +1,73 @@ +/* C11 threads basic mutex tests. + 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 +#include +#include + +#include + +/* Shared mutex between child and parent. */ +static mtx_t mutex; + +/* Shared counter to check possible race conditions. */ +static int counter; + +static int +child_add (void *arg) +{ + if (mtx_lock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_lock failed"); + + counter++; + + if (mtx_unlock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_unlock failed"); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + mtx_init (&mutex, mtx_plain); + + thrd_t id; + if (thrd_create (&id, child_add, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + if (mtx_lock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_lock failed"); + + counter++; + + if (mtx_unlock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_unlock failed"); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + + if (counter != 2) + FAIL_EXIT1 ("counter (%d) != 2", counter); + + mtx_destroy (&mutex); + + return 0; +} + +#include diff --git a/nptl/tst-mtx-recursive.c b/nptl/tst-mtx-recursive.c new file mode 100644 index 0000000..df959c7 --- /dev/null +++ b/nptl/tst-mtx-recursive.c @@ -0,0 +1,45 @@ +/* C11 threads recursive mutex tests. + 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 +#include +#include + +#include + +static int +do_test (void) +{ + static mtx_t mutex; + + if (mtx_init (&mutex, mtx_recursive) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + if (mtx_lock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_lock failed"); + + /* Lock mutex second time, if not recursive should deadlock. */ + if (mtx_lock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_lock failed"); + + mtx_destroy (&mutex); + + return 0; +} + +#include diff --git a/nptl/tst-mtx-timedlock.c b/nptl/tst-mtx-timedlock.c new file mode 100644 index 0000000..1f02bd4 --- /dev/null +++ b/nptl/tst-mtx-timedlock.c @@ -0,0 +1,98 @@ +/* C11 threads timed mutex tests. + 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 +#include +#include + +#include + +/* Shared mutex between child and parent. */ +static mtx_t mutex; + +/* Shared counter to check possible race conditions. */ +static char shrd_counter; + +/* Maximum amount of time waiting for mutex. */ +static struct timespec wait_time; + +/* Function to choose an action to do, depending on mtx_timedlock + return value. */ +static inline void +choose_action (int action, char* thread_name) +{ + switch (action) + { + case thrd_success: + ++shrd_counter; + + if (mtx_unlock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_unlock failed"); + break; + + case thrd_timedout: + break; + + case thrd_error: + FAIL_EXIT1 ("%s lock error", thread_name); + break; + } +} + +static int +child_add (void *arg) +{ + char child_name[] = "child"; + + /* Try to lock mutex. */ + choose_action (mtx_timedlock (&mutex, &wait_time), child_name); + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + char parent_name[] = "parent"; + + if (mtx_init (&mutex, mtx_timed) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + if (clock_gettime (CLOCK_REALTIME, &wait_time) != 0) + FAIL_EXIT1 ("clock_gettime failed"); + /* Tiny amount of time, to assure that if any thread finds it busy. + It will receive thrd_timedout. */ + wait_time.tv_nsec += 1; + + if (thrd_create (&id, child_add, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + choose_action (mtx_timedlock (&mutex, &wait_time), parent_name); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + + if (shrd_counter != 2 && shrd_counter != 1) + FAIL_EXIT1 ("shrd_counter != {1,2} (%d)", shrd_counter); + + mtx_destroy (&mutex); + + return 0; +} + +#include diff --git a/nptl/tst-mtx-trylock.c b/nptl/tst-mtx-trylock.c new file mode 100644 index 0000000..5c1e804 --- /dev/null +++ b/nptl/tst-mtx-trylock.c @@ -0,0 +1,90 @@ +/* C11 threads trylock mutex tests. + 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 +#include +#include + +#include + +/* Shared mutex between child and parent. */ +static mtx_t mutex; + +/* Shared counter to check possible race conditions. */ +static char shrd_counter; + +/* Function to choose an action to do, depending on mtx_trylock + return value. */ +static inline void +choose_action (int action, char* thread_name) +{ + switch (action) + { + case thrd_success: + ++shrd_counter; + + if (mtx_unlock (&mutex) != thrd_success) + FAIL_EXIT1 ("mtx_unlock failed"); + break; + + case thrd_busy: + break; + + case thrd_error: + FAIL_EXIT1 ("%s lock error", thread_name); + break; + } +} + +static int +child_add (void *arg) +{ + char child_name[] = "child"; + + /* Try to lock mutex. */ + choose_action (mtx_trylock (&mutex), child_name); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + char parent_name[] = "parent"; + + if (mtx_init (&mutex, mtx_timed) != thrd_success) + FAIL_EXIT1 ("mtx_init failed"); + + if (thrd_create (&id, child_add, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + choose_action (mtx_trylock (&mutex), parent_name); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_join failed"); + + if (shrd_counter != 2 && shrd_counter != 1) + FAIL_EXIT1 ("shrd_counter != {1,2} (%d)", shrd_counter); + + mtx_destroy (&mutex); + + return 0; +} + +#include diff --git a/nptl/tst-thrd-detach.c b/nptl/tst-thrd-detach.c new file mode 100644 index 0000000..ec28173 --- /dev/null +++ b/nptl/tst-thrd-detach.c @@ -0,0 +1,52 @@ +/* C11 threads thread detach tests. + 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 +#include +#include +#include + +#include + +static int +detach_thrd (void *arg) +{ + if (thrd_detach (thrd_current ()) != thrd_success) + FAIL_EXIT1 ("thrd_detach failed"); + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + + /* Create new thread. */ + if (thrd_create (&id, detach_thrd, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + /* Give some time so the thread can finish. */ + thrd_sleep (&(struct timespec){.tv_sec = 2}, NULL); + + if (thrd_join (id, NULL) == thrd_success) + FAIL_EXIT1 ("thrd_join succeed where it should fail"); + + return 0; +} + +#include diff --git a/nptl/tst-thrd-sleep.c b/nptl/tst-thrd-sleep.c new file mode 100644 index 0000000..17380b2 --- /dev/null +++ b/nptl/tst-thrd-sleep.c @@ -0,0 +1,51 @@ +/* C11 threads thread sleep tests. + 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 +#include +#include +#include + +#include + +static int +sleep_thrd (void *arg) +{ + struct timespec const *tl = (struct timespec const *) arg; + if (thrd_sleep (tl, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_sleep failed"); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + thrd_t id; + struct timespec wait_time = {.tv_sec = 3}; + + if (thrd_create (&id, sleep_thrd, (void *) (&wait_time)) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd failed"); + + return 0; +} + +#include diff --git a/nptl/tst-tss-basic.c b/nptl/tst-tss-basic.c new file mode 100644 index 0000000..8181dc1 --- /dev/null +++ b/nptl/tst-tss-basic.c @@ -0,0 +1,75 @@ +/* C11 threads specific storage tests. + 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 +#include +#include + +#include + +/* Thread specific storage. */ +static tss_t key; + +#define TSS_VALUE (void*) 0xFF + +static int +tss_thrd (void *arg) +{ + if (tss_create (&key, NULL) != thrd_success) + FAIL_EXIT1 ("tss_create failed"); + + if (tss_set (key, TSS_VALUE)) + FAIL_EXIT1 ("tss_set failed"); + + void *value = tss_get (key); + if (value == 0) + FAIL_EXIT1 ("tss_get failed"); + if (value != TSS_VALUE) + FAIL_EXIT1 ("tss_get returned %p, expected %p", value, TSS_VALUE); + + thrd_exit (thrd_success); +} + +static int +do_test (void) +{ + /* Setting an invalid key should return an error. */ + if (tss_set (key, TSS_VALUE) == thrd_success) + FAIL_EXIT1 ("tss_set succeed where it should have failed"); + + if (tss_create (&key, NULL) != thrd_success) + FAIL_EXIT1 ("tss_create failed"); + + thrd_t id; + if (thrd_create (&id, tss_thrd, NULL) != thrd_success) + FAIL_EXIT1 ("thrd_create failed"); + + if (thrd_join (id, NULL) != thrd_success) + FAIL_EXIT1 ("thrd failed"); + + /* The value set in tss_thrd should not be visible here. */ + void *value = tss_get (key); + if (value != 0) + FAIL_EXIT1 ("tss_get succeed where it should have failed"); + + tss_delete (key); + + return 0; +} + +#include From patchwork Wed May 10 18:40:56 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: 99014 Delivered-To: patch@linaro.org Received: by 10.182.142.97 with SMTP id rv1csp335778obb; Wed, 10 May 2017 11:41:59 -0700 (PDT) X-Received: by 10.98.51.129 with SMTP id z123mr7935564pfz.100.1494441719763; Wed, 10 May 2017 11:41:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494441719; cv=none; d=google.com; s=arc-20160816; b=UuCxPZB192Xp1fd2Na/6tkvld5Cx1qy5DGIyx3IOsZnPo9ZZ9bmjZKhItTJR+hLcXh pPwBlh0jhFGML5QU3Pifqejntackvk2s15P2pwT7XAVvyVNi2To2ypond45UNk7fKX6+ y765/48Sd87TwELxctv9i9pB8TEcSZzkYJwYKuN3Lnwp8RBsHOa4t6ZvGaNPlRSjadhA 3bB4TXda1hzEAfrc6g3UtCfsQHcvEwBP6ku98q7kR90IXn0OVBxBJMhQwG687t93y2c4 Qr6prRH4p3rwFi1jhMhfIdNKeR6eajf5YztlXDqRlec8TlVHN007wQnXGecU0VENWZl6 JsGw== 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:cc: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=VDqzAI25hHj3cyFm+k78Kb1ohP1YHegYc/Wurve9xFQ=; b=BYXVcYrhDvnEy8B5qUcOwsJmzS9mSJE+ghvkV1x3BvbgPbL45ai3rG3/HwvO51wBUT rUO2Skqx2Z37pIMA0XuCr88fQo8/3tNXoOrYGp/2GXDaSAEEXmNLWnoepByULjOx/nhT L2dezwNtIsvfYpxrLK1U+eqNqUJdasKToMxI7w4XtYeoqm/1De3XHCQDmKx/lFl3r6h3 Zrg4PYJdt8nC5s6AtGtj6FXZc/mdu7fAgKrA2flvZUMpnNIjx2irGuu+nMpbbVuwJktT q8y2zSNtqNQxVO9OiqNS9xsOW+zOL4aiTfkWNEnUJt7Es9DavLfjUsMcTF8hoaylbmu9 uVBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-79232-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79232-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 n75si3781898pfa.261.2017.05.10.11.41.59 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 May 2017 11:41:59 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-79232-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-79232-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-79232-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:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=LEaDJM8RheEB9OqfXSyQdhlUXeT/+fb T1LEzs8lA5ZTUOqAVAcIfmuyXO5IZqYvghmgrPX3h/mBgJI8N8kskwDPTYNga4EW 6GezR6EFoUJINoV3Y6ZctquwCBQLF1ShxbHK+MiUPVcRFefxzzSvDWyAw+dZtjFs RdbIQ/EAM/tE= 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:cc:subject:date:message-id:in-reply-to :references; s=default; bh=hmXxdrsQ0kDJoemWEcFhVxHqzWM=; b=Wi0WV 1Ejc8n1EjSx8SXR+ghBt/351HT4SgG+hYjHfxKaFTVFffStbGal5rKBXr7P7flxA 7Jk9NcsaZ6wdBKe93uU8Vnf6437akKRALR654KV5aVVrq86k2TFLf+2UabQvW3G5 /X0agd0kTmVmaTKVhapVxyfRWHX74BXOMv8H0s= Received: (qmail 108839 invoked by alias); 10 May 2017 18:41:23 -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 108517 invoked by uid 89); 10 May 2017 18:41:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.7 required=5.0 tests=AWL, 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=crypt, Juan, locked, Creation X-HELO: mail-qt0-f174.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:cc:subject:date:message-id:in-reply-to :references; bh=VDqzAI25hHj3cyFm+k78Kb1ohP1YHegYc/Wurve9xFQ=; b=BQwi4yAsQ6Pd/JMg7X25j7MczvUD16KRHMSsMAWyMMkGeshq43wBoPv4+ObFB8O7WS EznbV6Kh2q9ZeFiLe7At6mqJ+mVDzbxKCw2fkV+ltJ7EeBcHw5f9zuFWQb+OUrHtEtl9 /Jwcxq0jKfuBBikneOtBP+SPCqEtrIWTqoGtXyx+D+5/qbO9t3zc36bm3RXmwTbPomBV Fe2cZG/8ic62g6a82MZvZscMuWh1EB7tew6Tk17t4tfxnmw8f0/sy/aR09Bnh52jbof6 jbXmF6wWtgIRJuC6GS+oFxjtkBrqtzOiogsHoqcL374A/El9R2Fb6agz1n3htxfqGR7S +G2A== X-Gm-Message-State: AODbwcDpOG1Az42EJlthve53+eRYxp1Li6G/5qJwzOTtYCsuvZvUUtqg XpDmxmD48/11uOuP X-Received: by 10.200.55.145 with SMTP id d17mr7463837qtc.57.1494441671329; Wed, 10 May 2017 11:41:11 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Juan Manuel Torres Palma Subject: [PATCH v4 4/4] Add manual documentation for threads.h Date: Wed, 10 May 2017 15:40:56 -0300 Message-Id: <1494441656-1212-5-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> References: <1494441656-1212-1-git-send-email-adhemerval.zanella@linaro.org> From: Juan Manuel Torres Palma This patch updates the manual and adds a new chapter to the manual, explaining types macros, constants and functions defined by ISO C11 threads.h standard. * manual/Makefile (chapters): Add isothreads.texi. * manual/isothreads.texi: New file. Add new chapter for ISO C11 threads documentation. --- ChangeLog | 4 + manual/Makefile | 2 +- manual/isothreads.texi | 355 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 manual/isothreads.texi -- 2.7.4 diff --git a/manual/Makefile b/manual/Makefile index 510f160..70811b8 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -39,7 +39,7 @@ chapters = $(addsuffix .texi, \ pipe socket terminal syslog math arith time \ resource setjmp signal startup process ipc job \ nss users sysinfo conf crypt debug threads \ - probes tunables) + probes tunables isothreads) add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi)) appendices = lang.texi header.texi install.texi maint.texi platform.texi \ contrib.texi diff --git a/manual/isothreads.texi b/manual/isothreads.texi new file mode 100644 index 0000000..bcdf127 --- /dev/null +++ b/manual/isothreads.texi @@ -0,0 +1,355 @@ +@node ISO Threads, , , Top +@chapter ISO C11 threads + +This chapter describes @theglibc{} ISO C11 threads implementation. +To have a deeper understanding of this API, is strongly recomended +to read ISO/IEC 9899:2011, section 7.26 where ISO C11 threads +are specified. +All types and function prototypes are declared in +@file{threads.h} header. +@pindex threads.h + +@menu +* Thread Creation and Control:: Support for basic threading. +* Call Once:: Single call macros and functions. +* Mutex:: Low level mechanism for mutual exclusion. +* Condition variable:: High level objects for thread synchronization. +* Thread-local storage:: Functions to support thread-local storage. +* C11 error types:: Symbolic constants that represent functions return value. +@end menu + +@node Thread Creation and Control, Call Once, , ISO Threads +@section Thread Creation and Control + +@Theglibc{} implements a set of functions that allow the user to easily +create and use threads. Many extra functionalities are provided to control +the behaviour of threads. The following functions and types are defined: + +@deftp {Data Type} {thrd_t} +Unique object that identifies a thread unequivocally. +@end deftp + +@deftp {Data Type} {thrd_start_t} +It is a (@code{int (*)(void *)}) typedef that is passed to @code{thrd_create} +when creating a new thread. Should point to the first function that thread +will run. +@end deftp + +@deftypefun int thrd_create (thrd_t *@var{thr}, thrd_start_t @var{func}, void *@var{arg}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Create a new thread executing the function @var{func}. The object pointed +by @var{arg} will be taken as @var{func} arguments. If successful, +@var{thr} is set to the new thread identifier. +@end deftypefun + +@deftypefun int thrd_equal (thrd_t @var{lhs}, thrd_t @var{rhs}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Checks whether @var{lhs} and @var{rhs} refer to the same thread. +@end deftypefun + +@deftypefun thrd_t thrd_current (void) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Returns the identifier of the calling thread. +@end deftypefun + +@deftypefun int thrd_sleep (const struct timespec *@var{time_point}, struct timespec *@var{remaining}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Blocks the execution of the current thread for at least until the wall-clock +time point pointed to by @var{time_point} has been reached. This function +does not take an absolute time, but a duration that the thread is required +to be blocked. + +The sleep may resume earlier if a signal that is not ignored is received. +In such case, if remaining is not NULL, the remaining time duration is stored +into the object pointed to by @var{remaining} +@end deftypefun + +@deftypefun void thrd_yield (void) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Provides a hint to the implementation to reschedule the execution of threads, +allowing other threads to run. +@end deftypefun + +@deftypefun _Noreturn void thrd_exit (int @var{res}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Terminates execution of the calling thread and sets its result code to +@var{res}. +If this function is called from a single thread process, the call to this +function is equivalent to @code{exit(0)}. Returning from a thread-start +function is equivalent to calling @code{thrd_exit}. +@end deftypefun + +@deftypefun int thrd_detach (thrd_t @var{thr}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Detaches the thread identified by @var{thr} from the current control thread. +The resources held by the thread will be freed automatically once the thread +exits. The parent thread will never be notified by any @var{thr} signal. +@end deftypefun + +@deftypefun int thrd_join (thrd_t @var{thr}, int *@var{res}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Blocks the current thread until the thread identified by @var{thr} finishes +execution. If @var{res} is not a null pointer, the result code of the thread +is put to the location pointed to by @var{res}. The termination of the thread +synchronizes-with the completion of this function. +The behavior is undefined if the thread was previously detached or joined by +another thread. +@end deftypefun + +@node Call Once, Mutex, Thread Creation and Control, ISO Threads +@section Call Once + +In order to guarantee single access to a function, @theglibc implements a call +once function to allow unique access in case a function is required to be +called only once in presence of several threads. + +@deftp {Data Type} {once_flag} +Complete object type capable of holding a flag used by @code{call_once} +@end deftp + +@deftypevr Macro {} ONCE_FLAG_INIT +Value established to initialize an object of type @code{once_flag}. +@end deftypevr + +@deftypefun void call_once (once_flag *@var{flag}, void (*@var{func})(void)) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Calls function @var{func} exactly once, even if invoked from several threads. +The completion of the function @var{func} synchronizes with all previous or +subsequent calls to @code{call_once} with the same @var{flag} variable. +@end deftypefun + +@node Mutex, Condition variable, Call Once, ISO Threads +@section Mutex + +To have a better control of resources and how threads access them, @theglibc{} +also implements a mutex object, that allows to avoid race conditions and some +other concurrency issues. + +@deftp {Data Type} {mtx_t} +Mutex object identifier. +@end deftp + +@deftypefun int mtx_init (mtx_t *@var{mutex}, int @var{type}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Creates a new mutex object with type @var{type}. The object pointed to by +@var{mutex} is set to an identifier of the newly created mutex. +@end deftypefun + +@deftypefun int mtx_lock (mtx_t *@var{mutex}) +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} Blocks +the current thread until the mutex pointed to by @var{mutex} is locked. +The behavior is undefined if the current thread has already locked the mutex +and the mutex is not recursive. +Prior calls to @code{mtx_unlock} on the same mutex synchronize-with this +operation, and all lock/unlock operations on any given mutex form a single +total order (similar to the modification order of an atomic). +@end deftypefun + +@deftypefun int mtx_timedlock (mtx_t *restrict @var{mutex}, const struct timespec *restrict @var{time_point}) +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} +Blocks the current thread until the mutex pointed to by @var{mutex} is locked +or until the wall-clock time pointed to by @var{time_point} has been reached. +This function takes an absolute time, so if a duration is required, must be +calculated manually and passed to this function. + +The behavior is undefined if the current thread has already locked the mutex +and the mutex is not recursive. The behavior is undefined if the mutex does +not support timeout. +Prior calls to @code{mtx_unlock} on the same mutex synchronize-with this +operation (if this operation succeeds), and all lock/unlock operations on any +given mutex form a single total order (similar to the modification order of +an atomic). +@end deftypefun + +@deftypefun int mtx_trylock (mtx_t *@var{mutex}) +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} +Tries to lock the mutex pointed to by @var{mutex} without blocking. Returns +immediately if the mutex is already locked. +Prior calls to @code{mtx_unlock} on the same mutex synchronize-with this +operation (if this operation succeeds), and all lock/unlock operations on any +given mutex form a single total order (similar to the modification order of +an atomic). +@end deftypefun + +@deftypefun int mtx_unlock (mtx_t *@var{mutex}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Unlocks the mutex pointed to by @var{mutex}. The behavior is undefined if the +mutex is not locked by the calling thread. This function synchronizes-with +subsequent @code{mtx_lock}, @code{mtx_trylock}, or @code{mtx_timedlock} on +the same mutex. All lock/unlock operations on any given mutex form a single +total order (similar to the modification order of an atomic). +@end deftypefun + +@deftypefun void mtx_destroy (mtx_t *@var{mutex}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Destroys the mutex pointed to by @var{mutex}. If there are threads waiting +on mutex, the behavior is undefined. +@end deftypefun + +The ISO C11 standard also defines several types of mutex that are also +supported. They are represented with symbolic constants (enumeration type +values) and are the following: + +@vtable @code + +@item mtx_plain +Mutex type that does not support timeout or test and return. + +@item mtx_recursive +Mutex type that supports recursive locking, what means that owner thread can +lock it twice or more without causing deadlock. + +@item mtx_timed +Mutex type that supports timeout. + +@end vtable + +@node Condition variable, Thread-local storage, Mutex, ISO Threads +@section Condition Variable + +Mutexes are not the only synchronization mechanisms available. For some more +complex tasks, @theglibc{} also implements conditional variables, that allow +the user to think in a higher level to solve complex synchronization problems. +They are used to synchronize threads waiting on a certain condition to happen. + +@deftp {Data Type} {cnd_t} +Condition variable object identifier. +@end deftp + +@deftypefun int cnd_init (cnd_t *@var{cond}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Initializes new conditional variable. The object pointed to by @var{cond} +will be set to value that identifies the conditional variable. +@end deftypefun + +@deftypefun int cnd_signal (cnd_t *@var{cond}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Unblocks one thread that currently waits on conditional variable pointed to +by @var{cond}. If no threads are blocked, does nothing and returns +@code{thrd_success}. +@end deftypefun + +@deftypefun int cnd_broadcast (cnd_t *@var{cond}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Unblocks all threads that currently wait on conditional variable pointed to +by @var{cond}. If no threads are blocked, does nothing and returns +@code{thrd_success}. +@end deftypefun + +@deftypefun int cnd_wait (cnd_t *@var{cond}, mtx_t *@var{mutex}) +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} +Atomically unlocks the mutex pointed to by @var{mutex} and blocks on the +conditional variable pointed to by @var{cond} until the thread is signalled +by @code{cnd_signal} or @code{cnd_broadcast}. The mutex is locked again +before the function returns. +@end deftypefun + +@deftypefun int cnd_timedwait (cnd_t *restrict @var{cond}, mtx_t *restrict @var{mutex}, const struct timespec *restrict @var{time_point}) +@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} +Atomically unlocks the mutex pointed to by @var{mutex} and blocks on the +conditional variable pointed to by @var{cond} until the thread is signalled +by @code{cnd_signal} or @code{cnd_broadcast}, or until the wall-clock time +pointed to by @var{time_point} has been reached. The mutex is locked again +before the function returns. +As for @code{mtx_timedlock}, this function also takes an absolute time +rather than a duration. +@end deftypefun + +@deftypefun void cnd_destroy (cnd_t *@var{cond}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Destroys the conditional variable pointed to by @var{cond}. If there are +threads waiting on @var{cond}, the behavior is undefined. +@end deftypefun + +@node Thread-local storage, C11 error types, Condition variable, ISO Threads +@section Thread-local Storage + +@Theglibc{} also implements different functions that adds funtionality for +thread-local storage. That means that each thread can have their own +variables and are not visible by other threads. The functions and types +provided are: + +@deftp {Data Type} {tss_t} +Thread-specific storage object. Even if shared, every thread will have +its own instance of that variable with different values. +@end deftp + +@deftp {Data Type} {tss_dtor_t} +Function pointer of type @code{void(*)(void*)}, used for TSS destructor. +This function will be called when the current thread calls @code{thrd_exit}, +but never when calling @code{tss_delete} or @code{exit} +@end deftp + +@deftypevr Macro {} thread_local +Used to mark a variable with thread storage duration, that means created +when the thread starts and cleaned up when the thread ends. +@end deftypevr + +@deftypevr Macro {} TSS_DTOR_ITERATIONS +Integer constant expression representing the maximum number of times that +destructors will be called when a thread terminates. +@end deftypevr + +@deftypefun int tss_create (tss_t *@var{tss_key}, tss_dtor_t @var{destructor}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Creates new thread-specific storage key and stores it in the object pointed +to by @var{tss_key}. Although the same key value may be used by different +threads, the values bound to the key by @code{tss_set} are maintained on a +per-thread basis and persist for the life of the calling thread. + +If @var{destructor} is different to NULL, a destructor function will be set, +and called when the thread finishes its execution by calling @code{thrd_exit}. +@end deftypefun + +@deftypefun void *tss_get (tss_t @var{tss_key}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Returns the value held in thread-specific storage for the current thread +identified by @var{tss_key}. Different threads may get different values +identified by the same key. +@end deftypefun + +@deftypefun int tss_set (tss_t @var{tss_id}, void *@var{val}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Sets the value of the thread-specific storage identified by @var{tss_id} for +the current thread to @var{val}. Different threads may set different values +to the same key. The destructor, if available, is not invoked. +@end deftypefun + +@deftypefun void tss_delete (tss_t @var{tss_id}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +Destroys the thread-specific storage identified by @var{tss_id}. The +destructor, if one was registered by @code{tss_create}, is not called. +@end deftypefun + +@node C11 error types, , Thread-local storage, ISO Threads +@section Error Types + +The ISO C11 specification also provides new error types that belong +specifically to @code{threads.h}. @Theglibc{} has also implemented this +feature and every function in this API always returns one of the following +error codes: + +@vtable @code + +@item thrd_timedout +Value returned by a function to indicate that a specified time was reached +without acquiring the requested resource, usually a mutex or conditional +variable. + +@item thrd_sucess +Value returned by a function to indicate that the requested operation +succeded. + +@item thrd_busy +Value returned by a function to indicate that the requested operation +failed because a resource requested is already in use. + +@item thrd_error +Value returned by a function to indicate that the requested operation +failed. + +@item thrd_nomem +Value returned by a function to indicate that the requested operation +failed because it was unable to allocate enough memory. + +@end vtable