From patchwork Mon Apr 10 23:10:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 749272 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3w25XY0yJyz9s9N for ; Tue, 11 Apr 2017 09:11:24 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="orX6VEnp"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:mime-version:content-type:from :in-reply-to:date:cc:message-id:references:to; q=dns; s=default; b= NINSWm+WWtt12d9PP6/PXOazd66gBMClms040rgomfLka00nPTiyBWhkaKEw/JWE 3HdUwxTUqpiG3cc7R09mHn6LuN+eWWIb9SpNJ03E0S+EoqWOf4pOJfpdVgsweTLr gOkrVS+QJTB6LlCFTSexB/O3rLVsnH3rr9ajZhSlY1o= 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:subject:mime-version:content-type:from :in-reply-to:date:cc:message-id:references:to; s=default; bh=CiP 06Rsd8KIcLG2s/jqfV9Ag2rw=; b=orX6VEnpa0jspHAp4QHRWDD7jzgHyd+i556 FsA5Ldal9sTqGb20TAOS24aOVHAtrnbxAaofLgGqcbe5CbX5FqxME2UrL19APvnY SmAARhyB2TYwfQ2JeTHYnwZIxM17QNn2uDVP3Ar459HH8dvHNfnRlDa4UQtLGs0O X1G4IvpE= Received: (qmail 112050 invoked by alias); 10 Apr 2017 23:11: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 111900 invoked by uid 89); 10 Apr 2017 23:11:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY, URIBL_RED autolearn=ham version=3.3.2 spammy=yield, sk:version, __data X-HELO: torfep02.bell.net Subject: [PATCH v3] hppa: Use generic pthread conditional variable support (BZ #21016) Mime-Version: 1.0 (Apple Message framework v1085) From: John David Anglin In-Reply-To: <310BAFFD-7FA8-4101-971A-D6E261ADFDA2@bell.net> Date: Mon, 10 Apr 2017 19:10:56 -0400 Cc: GNU C Library , Carlos O'Donell , Mike Frysinger , Helge Deller , Aaro Koskinen Message-Id: <04DA28B9-6679-4FF2-A711-18D120FCEA1C@bell.net> References: <3278DDA9-61C9-44E2-9130-F625953652FA@bell.net> <310BAFFD-7FA8-4101-971A-D6E261ADFDA2@bell.net> To: John David Anglin On 2017-04-01, at 10:01 AM, John David Anglin wrote: > On 2017-03-12, at 10:58 AM, John David Anglin wrote: > >> The attach change switches the hppa target to use the generic pthread conditional variable support. >> We lose compatibility with linuxthreads but I don't think that is relevant anymore for the existing distributions. >> >> The change fixes bug nptl/21016. > > Here is an updated patch to switch hppa to generic pthread conditional variable support. The previous version had a problem, namely the failure of nptl/tst-typesizes. This was caused by an incorrect size for the pthread_cond_t type. The placement of "__attribute__ ((__aligned__(16)))" increased the size. This is fixed revising the pthread_cond_t declaration. New test results are below. Most of the math fails have been fixed by a regen of the ulps. > > As noted by Aaro, the original patch didn't delete sysdeps/unix/sysv/linux/hppa/pthread_cond_init.c. This > is corrected here. Otherwise, the patches are the same. > > Retested last night on my tree with the following results: > > FAIL: debug/tst-backtrace2 > FAIL: debug/tst-backtrace3 > FAIL: debug/tst-backtrace4 > FAIL: debug/tst-backtrace5 > FAIL: debug/tst-backtrace6 > FAIL: elf/check-execstack > FAIL: elf/check-textrel > FAIL: elf/tst-audit2 > FAIL: malloc/tst-malloc-thread-fail > FAIL: malloc/tst-trim1 > FAIL: math/test-double-cacos > FAIL: math/test-double-cacosh > FAIL: math/test-double-canonicalize > FAIL: math/test-double-casin > FAIL: math/test-double-casinh > FAIL: math/test-double-catan > FAIL: math/test-double-catanh > FAIL: math/test-double-finite-cacos > FAIL: math/test-double-finite-cacosh > FAIL: math/test-double-finite-casin > FAIL: math/test-double-finite-casinh > FAIL: math/test-double-finite-catan > FAIL: math/test-double-finite-catanh > FAIL: math/test-float-cacos > FAIL: math/test-float-cacosh > FAIL: math/test-float-canonicalize > FAIL: math/test-float-casin > FAIL: math/test-float-casinh > FAIL: math/test-float-catan > FAIL: math/test-float-catanh > FAIL: math/test-float-finite-cacos > FAIL: math/test-float-finite-cacosh > FAIL: math/test-float-finite-casin > FAIL: math/test-float-finite-casinh > FAIL: math/test-float-finite-catan > FAIL: math/test-float-finite-catanh > FAIL: math/test-idouble-cacos > FAIL: math/test-idouble-cacosh > FAIL: math/test-idouble-canonicalize > FAIL: math/test-idouble-casin > FAIL: math/test-idouble-casinh > FAIL: math/test-idouble-catan > FAIL: math/test-idouble-catanh > FAIL: math/test-ifloat-cacos > FAIL: math/test-ifloat-cacosh > FAIL: math/test-ifloat-canonicalize > FAIL: math/test-ifloat-casin > FAIL: math/test-ifloat-casinh > FAIL: math/test-ifloat-catan > FAIL: math/test-ifloat-catanh > UNSUPPORTED: nptl/test-cond-printers > UNSUPPORTED: nptl/test-condattr-printers > UNSUPPORTED: nptl/test-mutex-printers > UNSUPPORTED: nptl/test-mutexattr-printers > UNSUPPORTED: nptl/test-rwlock-printers > UNSUPPORTED: nptl/test-rwlockattr-printers > FAIL: nptl/tst-cleanupx4 > FAIL: nptl/tst-cond25 > FAIL: nptl/tst-create-detached > FAIL: nptl/tst-robust-fork > FAIL: nptl/tst-rwlock19 > FAIL: nptl/tst-stack4 > FAIL: nptl/tst-typesizes > FAIL: resolv/tst-resolv-basic > FAIL: resolv/tst-resolv-search > FAIL: stdlib/tst-setcontext2 > UNSUPPORTED: sunrpc/tst-svc_register > FAIL: timezone/tst-tzset > Summary of test results: > 61 FAIL > 3225 PASS > 7 UNSUPPORTED > 45 XFAIL V3 results: FAIL: debug/tst-backtrace2 FAIL: debug/tst-backtrace3 FAIL: debug/tst-backtrace4 FAIL: debug/tst-backtrace5 FAIL: debug/tst-backtrace6 FAIL: elf/check-execstack FAIL: elf/check-textrel FAIL: elf/tst-audit2 FAIL: malloc/tst-malloc-thread-fail FAIL: malloc/tst-trim1 FAIL: math/test-double-canonicalize FAIL: math/test-float-canonicalize FAIL: math/test-idouble-canonicalize FAIL: math/test-ifloat-canonicalize UNSUPPORTED: nptl/test-cond-printers UNSUPPORTED: nptl/test-condattr-printers UNSUPPORTED: nptl/test-mutex-printers UNSUPPORTED: nptl/test-mutexattr-printers UNSUPPORTED: nptl/test-rwlock-printers UNSUPPORTED: nptl/test-rwlockattr-printers FAIL: nptl/tst-cleanupx4 FAIL: nptl/tst-cond25 FAIL: nptl/tst-create-detached FAIL: nptl/tst-robust-fork FAIL: nptl/tst-rwlock19 FAIL: resolv/tst-resolv-basic FAIL: resolv/tst-resolv-search FAIL: stdlib/tst-setcontext2 FAIL: timezone/tst-tzset Summary of test results: 23 FAIL 3267 PASS 6 UNSUPPORTED 45 XFAIL Dave --- John David Anglin dave.anglin@bell.net diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes.h b/sysdeps/hppa/nptl/bits/pthreadtypes.h index e37111a2f3..2f17318121 100644 --- a/sysdeps/hppa/nptl/bits/pthreadtypes.h +++ b/sysdeps/hppa/nptl/bits/pthreadtypes.h @@ -103,40 +103,34 @@ typedef union long int __align; } pthread_mutexattr_t; - -/* Data structure for conditional variable handling. The structure of - the attribute type is not exposed on purpose. However, this structure - is exposed via PTHREAD_COND_INITIALIZER, and because of this, the - Linuxthreads version sets the first four ints to one. In the NPTL - version we must check, in every function using pthread_cond_t, - for the static Linuxthreads initializer and clear the appropriate - words. */ +/* Data structure for conditional variable handling. */ typedef union { struct { - /* In the old Linuxthreads pthread_cond_t, this is the - start of the 4-word lock structure, the next four words - are set all to 1 by the Linuxthreads - PTHREAD_COND_INITIALIZER. */ - int __lock __attribute__ ((__aligned__(16))); - /* Tracks the initialization of this structure: - 0 initialized with NPTL PTHREAD_COND_INITIALIZER. - 1 initialized with Linuxthreads PTHREAD_COND_INITIALIZER. - 2 initialization in progress. */ - int __initializer; - unsigned int __futex; - void *__mutex; - /* In the old Linuxthreads this would have been the start - of the pthread_fastlock status word. */ - __extension__ unsigned long long int __total_seq; - __extension__ unsigned long long int __wakeup_seq; - __extension__ unsigned long long int __woken_seq; - unsigned int __nwaiters; - unsigned int __broadcast_seq; - /* The NPTL pthread_cond_t is exactly the same size as - the Linuxthreads version, there are no words to spare. */ + __extension__ union + { + __extension__ unsigned long long int __wseq; + struct { + unsigned int __low; + unsigned int __high; + } __wseq32; + }; + __extension__ union + { + __extension__ unsigned long long int __g1_start; + struct { + unsigned int __low; + unsigned int __high; + } __g1_start32; + }; + unsigned int __g_refs[2]; + unsigned int __g_size[2]; + unsigned int __g1_orig_size; + unsigned int __wrefs; + unsigned int __g_signals[2]; } __data; + int __unused_lock __attribute__ ((__aligned__(16))); char __size[__SIZEOF_PTHREAD_COND_T]; __extension__ long long int __align; } pthread_cond_t; diff --git a/sysdeps/unix/sysv/linux/hppa/internaltypes.h b/sysdeps/unix/sysv/linux/hppa/internaltypes.h deleted file mode 100644 index d6496579da..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/internaltypes.h +++ /dev/null @@ -1,84 +0,0 @@ -#include_next -#ifndef _INTERNAL_TYPES_H_HPPA_ -#define _INTERNAL_TYPES_H_HPPA_ 1 -#include - -/* In GLIBC 2.10 HPPA switched from Linuxthreads to NPTL, and in order -to maintain ABI compatibility with pthread_cond_t, some care had to be -taken. - -The NPTL pthread_cond_t grew in size. When HPPA switched to NPTL, we -dropped the use of ldcw, and switched to the kernel helper routine for -compare-and-swap. This allowed HPPA to use the 4-word 16-byte aligned -lock words, and alignment words to store the additional pthread_cond_t -data. Once organized properly the new NPTL pthread_cond_t was 1 word -smaller than the Linuxthreads version. - -However, we were faced with the case that users may have initialized the -pthread_cond_t with PTHREAD_COND_INITIALIZER. In this case, the first -four words were set to one, and must be cleared before any NPTL code -used these words. - -We didn't want to use LDCW, because it continues to be a source of bugs -when applications memset pthread_cond_t to all zeroes by accident. This -works on all other architectures where lock words are unlocked at zero. -Remember that because of the semantics of LDCW, a locked word is set to -zero, and an unlocked word is set to 1. - -Instead we used atomic_compare_and_exchange_val_acq, but we couldn't use -this on any of the pthread_cond_t words, otherwise it might interfere -with the current operation of the structure. To solve this problem we -used the left over word. - -If the stucture was initialized by a legacy Linuxthread -PTHREAD_COND_INITIALIZER it contained a 1, and this indicates that the -structure requires zeroing for NPTL. The first thread to come upon a -pthread_cond_t with a 1 in the __initializer field, will -compare-and-swap the value, placing a 2 there which will cause all other -threads using the same pthread_cond_t to wait for the completion of the -initialization. Lastly, we use a store (with memory barrier) to change -__initializer from 2 to 0. Note that the store is strongly ordered, but -we use the PA 1.1 compatible form which is ",ma" with zero offset. - -In the future, when the application is recompiled with NPTL -PTHREAD_COND_INITIALIZER it will be a quick compare-and-swap, which -fails because __initializer is zero, and the structure will be used as -is correctly. */ - -#define cond_compat_clear(var) \ -({ \ - int tmp = 0; \ - var->__data.__wseq = 0; \ - var->__data.__signals_sent = 0; \ - var->__data.__confirmed = 0; \ - var->__data.__generation = 0; \ - var->__data.__mutex = NULL; \ - var->__data.__quiescence_waiters = 0; \ - var->__data.__clockid = 0; \ - /* Clear __initializer last, to indicate initialization is done. */ \ - /* This synchronizes-with the acquire load below. */ \ - atomic_store_release (&var->__data.__initializer, 0); \ -}) - -#define cond_compat_check_and_clear(var) \ -({ \ - int v; \ - int *value = &var->__data.__initializer; \ - /* This synchronizes-with the release store above. */ \ - while ((v = atomic_load_acquire (value)) != 0) \ - { \ - if (v == 1 \ - /* Relaxed MO is fine; it only matters who's first. */ \ - && atomic_compare_exchange_acquire_weak_relaxed (value, 1, 2)) \ - { \ - /* We're first; initialize structure. */ \ - cond_compat_clear (var); \ - break; \ - } \ - else \ - /* Yield before we re-check initialization status. */ \ - sched_yield (); \ - } \ -}) - -#endif diff --git a/sysdeps/unix/sysv/linux/hppa/pthread.h b/sysdeps/unix/sysv/linux/hppa/pthread.h index ac617201d2..d3b960edd4 100644 --- a/sysdeps/unix/sysv/linux/hppa/pthread.h +++ b/sysdeps/unix/sysv/linux/hppa/pthread.h @@ -185,7 +185,7 @@ enum /* Conditional variable handling. */ -#define PTHREAD_COND_INITIALIZER { { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } } +#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, {0, 0}, 0, 0, {0, 0} } } /* Cleanup buffers */ @@ -1165,12 +1165,6 @@ __END_DECLS #ifndef _PTHREAD_H_HPPA_ #define _PTHREAD_H_HPPA_ 1 -/* The pthread_cond_t initializer is compatible only with NPTL. We do not - want to be forwards compatible, we eventually want to drop the code - that has to clear the old LT initializer. */ -#undef PTHREAD_COND_INITIALIZER -#define PTHREAD_COND_INITIALIZER { { 0, 0, 0, (void *) 0, 0, 0, 0, 0, 0 } } - /* The pthread_mutex_t and pthread_rwlock_t initializers are compatible only with NPTL. NPTL assumes pthread_rwlock_t is all zero. */ #undef PTHREAD_MUTEX_INITIALIZER diff --git a/sysdeps/unix/sysv/linux/hppa/pthread_cond_broadcast.c b/sysdeps/unix/sysv/linux/hppa/pthread_cond_broadcast.c deleted file mode 100644 index a6f9f5d433..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/pthread_cond_broadcast.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Carlos O'Donell , 2009. - - 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 INCLUDED_SELF -# define INCLUDED_SELF -# include -#else -# include -# include -# include -# include -int -__pthread_cond_broadcast (pthread_cond_t *cond) -{ - cond_compat_check_and_clear (cond); - return __pthread_cond_broadcast_internal (cond); -} -versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast, - GLIBC_2_3_2); -# undef versioned_symbol -# define versioned_symbol(lib, local, symbol, version) -# undef __pthread_cond_broadcast -# define __pthread_cond_broadcast __pthread_cond_broadcast_internal -# include_next -#endif diff --git a/sysdeps/unix/sysv/linux/hppa/pthread_cond_destroy.c b/sysdeps/unix/sysv/linux/hppa/pthread_cond_destroy.c deleted file mode 100644 index 49af087bb4..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/pthread_cond_destroy.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Carlos O'Donell , 2009. - - 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 INCLUDED_SELF -# define INCLUDED_SELF -# include -#else -# include -# include -# include -# include -int -__pthread_cond_destroy (pthread_cond_t *cond) -{ - cond_compat_check_and_clear (cond); - return __pthread_cond_destroy_internal (cond); -} -versioned_symbol (libpthread, __pthread_cond_destroy, pthread_cond_destroy, - GLIBC_2_3_2); -# undef versioned_symbol -# define versioned_symbol(lib, local, symbol, version) -# undef __pthread_cond_destroy -# define __pthread_cond_destroy __pthread_cond_destroy_internal -# include_next -#endif diff --git a/sysdeps/unix/sysv/linux/hppa/pthread_cond_init.c b/sysdeps/unix/sysv/linux/hppa/pthread_cond_init.c deleted file mode 100644 index ccb3de07ff..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/pthread_cond_init.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Carlos O'Donell , 2009. - - 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 INCLUDED_SELF -# define INCLUDED_SELF -# include -#else -# include -# include -# include -# include -int -__pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr) -{ - cond_compat_clear (cond); - return __pthread_cond_init_internal (cond, cond_attr); -} -versioned_symbol (libpthread, __pthread_cond_init, pthread_cond_init, - GLIBC_2_3_2); -# undef versioned_symbol -# define versioned_symbol(lib, local, symbol, version) -# undef __pthread_cond_init -# define __pthread_cond_init __pthread_cond_init_internal -# include_next -#endif diff --git a/sysdeps/unix/sysv/linux/hppa/pthread_cond_signal.c b/sysdeps/unix/sysv/linux/hppa/pthread_cond_signal.c deleted file mode 100644 index 2bf32af933..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/pthread_cond_signal.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Carlos O'Donell , 2009. - - 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 INCLUDED_SELF -# define INCLUDED_SELF -# include -#else -# include -# include -# include -# include -int -__pthread_cond_signal (pthread_cond_t *cond) -{ - cond_compat_check_and_clear (cond); - return __pthread_cond_signal_internal (cond); -} -versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal, - GLIBC_2_3_2); -# undef versioned_symbol -# define versioned_symbol(lib, local, symbol, version) -# undef __pthread_cond_signal -# define __pthread_cond_signal __pthread_cond_signal_internal -# include_next -#endif diff --git a/sysdeps/unix/sysv/linux/hppa/pthread_cond_wait.c b/sysdeps/unix/sysv/linux/hppa/pthread_cond_wait.c deleted file mode 100644 index 1cc2fc15d4..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/pthread_cond_wait.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Carlos O'Donell , 2009. - - 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 INCLUDED_SELF -# define INCLUDED_SELF -# include -#else -# include -# include -# include -# include -int -__pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - cond_compat_check_and_clear (cond); - return __pthread_cond_wait_internal (cond, mutex); -} -versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, - GLIBC_2_3_2); -int -__pthread_cond_timedwait (cond, mutex, abstime) - pthread_cond_t *cond; - pthread_mutex_t *mutex; - const struct timespec *abstime; -{ - cond_compat_check_and_clear (cond); - return __pthread_cond_timedwait_internal (cond, mutex, abstime); -} -versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait, - GLIBC_2_3_2); -# undef versioned_symbol -# define versioned_symbol(lib, local, symbol, version) -# undef __pthread_cond_wait -# define __pthread_cond_wait __pthread_cond_wait_internal -# undef __pthread_cond_timedwait -# define __pthread_cond_timedwait __pthread_cond_timedwait_internal -# include_next -#endif