From patchwork Sat Sep 19 13:07:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1367571 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Btrc84v9Cz9sSW for ; Sat, 19 Sep 2020 23:08:23 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2A3B43959E5B; Sat, 19 Sep 2020 13:08:18 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by sourceware.org (Postfix) with ESMTPS id 358313870856 for ; Sat, 19 Sep 2020 13:08:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 358313870856 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4Btrbx1R8Yz1qrfb; Sat, 19 Sep 2020 15:08:13 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4Btrbw6xsvz1sM9k; Sat, 19 Sep 2020 15:08:12 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id COUoMpvRjXRV; Sat, 19 Sep 2020 15:08:11 +0200 (CEST) X-Auth-Info: l2hZQHG+GymTYRIQlxyaA8WE/OQPpynSQjGk3i5d3Pk= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Sat, 19 Sep 2020 15:08:11 +0200 (CEST) From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Subject: [PATCH v2 1/3] nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h Date: Sat, 19 Sep 2020 15:07:57 +0200 Message-Id: <20200919130759.31916-1-lukma@denx.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-Spam-Status: No, score=-16.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , GNU C Library , Andreas Schwab , Stepan Golosunov , Alistair Francis Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" This alias macro shall be moved to the beginning of the futex-internal.h to be easily reused by other functions, which would support 64 bit time. Reviewed-by: Alistair Francis Reviewed-by: Adhemerval Zanella --- Changes for v2: - None --- sysdeps/nptl/futex-internal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h index 84ab3f3853..7f3910ad98 100644 --- a/sysdeps/nptl/futex-internal.h +++ b/sysdeps/nptl/futex-internal.h @@ -74,6 +74,10 @@ # error FUTEX_PRIVATE must be equal to 0 #endif +#ifndef __NR_futex_time64 +# define __NR_futex_time64 __NR_futex +#endif + /* Calls __libc_fatal with an error message. Convenience function for concrete implementations of the futex interface. */ static __always_inline __attribute__ ((__noreturn__)) void @@ -467,10 +471,6 @@ futex_unlock_pi (unsigned int *futex_word, int private) } } -#ifndef __NR_futex_time64 -# define __NR_futex_time64 __NR_futex -#endif - static __always_inline int futex_timed_wait_cancel64 (pid_t *tidp, pid_t tid, const struct __timespec64 *timeout, int private) From patchwork Sat Sep 19 13:07:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1367572 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BtrcD2TVLz9sSW for ; Sat, 19 Sep 2020 23:08:28 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B381396ECB0; Sat, 19 Sep 2020 13:08:18 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by sourceware.org (Postfix) with ESMTPS id 35589386F825 for ; Sat, 19 Sep 2020 13:08:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 35589386F825 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4Btrbz18Kjz1qrfg; Sat, 19 Sep 2020 15:08:15 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4Btrbz08KHz1sM9m; Sat, 19 Sep 2020 15:08:15 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id WxpXG4G_IIuu; Sat, 19 Sep 2020 15:08:13 +0200 (CEST) X-Auth-Info: M8MTqKD7r8htO9tRuY8pEfFFUlTeSU8KeRtO6WwdhIY= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Sat, 19 Sep 2020 15:08:13 +0200 (CEST) From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Subject: [PATCH v2 2/3] Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time Date: Sat, 19 Sep 2020 15:07:58 +0200 Message-Id: <20200919130759.31916-2-lukma@denx.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200919130759.31916-1-lukma@denx.de> References: <20200919130759.31916-1-lukma@denx.de> MIME-Version: 1.0 X-Spam-Status: No, score=-16.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , GNU C Library , Andreas Schwab , Stepan Golosunov , Alistair Francis Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" This is the helper function, which uses struct __timespec64 to provide 64 bit absolute time to futex syscalls. The aim of this function is to move convoluted pre-processor macro code from sysdeps/nptl/lowlevellock-futex.h to C function in futex-internal.c The futex_abstimed_wait64 function has been put into a separate file on the purpose - to avoid issues apparent on the m68k architecture related to small number of available registers (there is not enough registers to put all necessary arguments in them if the above function would be added to futex-internal.h with __always_inline attribute). Additional precautions for m68k port have been taken - the futex-internal.c file will be compiled with -fno-inline flag. Reviewed-by: Alistair Francis --- Changes for v2: - Handle the case when *abstime pointer is NULL --- sysdeps/nptl/futex-internal.c | 70 +++++++++++++++++++++++++++ sysdeps/nptl/futex-internal.h | 6 +++ sysdeps/unix/sysv/linux/m68k/Makefile | 2 + 3 files changed, 78 insertions(+) diff --git a/sysdeps/nptl/futex-internal.c b/sysdeps/nptl/futex-internal.c index 3366aac162..3211b4c94f 100644 --- a/sysdeps/nptl/futex-internal.c +++ b/sysdeps/nptl/futex-internal.c @@ -45,6 +45,29 @@ __futex_abstimed_wait_cancelable32 (unsigned int* futex_word, abstime != NULL ? &ts32 : NULL, NULL /* Unused. */, FUTEX_BITSET_MATCH_ANY); } + +static int +__futex_abstimed_wait32 (unsigned int* futex_word, + unsigned int expected, clockid_t clockid, + const struct __timespec64* abstime, + int private) +{ + struct timespec ts32; + + if (abstime != NULL && ! in_time_t_range (abstime->tv_sec)) + return -EOVERFLOW; + + unsigned int clockbit = (clockid == CLOCK_REALTIME) ? + FUTEX_CLOCK_REALTIME : 0; + int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private); + + if (abstime != NULL) + ts32 = valid_timespec64_to_timespec (*abstime); + + return INTERNAL_SYSCALL_CALL (futex, futex_word, op, expected, + abstime != NULL ? &ts32 : NULL, + NULL /* Unused. */, FUTEX_BITSET_MATCH_ANY); +} #endif int @@ -97,3 +120,50 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word, futex_fatal_error (); } } + +int +__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected, + clockid_t clockid, + const struct __timespec64* abstime, int private) +{ + unsigned int clockbit; + int err; + + /* Work around the fact that the kernel rejects negative timeout values + despite them being valid. */ + if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) + return ETIMEDOUT; + + if (! lll_futex_supported_clockid(clockid)) + return EINVAL; + + clockbit = (clockid == CLOCK_REALTIME) ? FUTEX_CLOCK_REALTIME : 0; + int op = __lll_private_flag (FUTEX_WAIT_BITSET | clockbit, private); + + err = INTERNAL_SYSCALL_CALL (futex_time64, futex_word, op, expected, + abstime, NULL /* Unused. */, + FUTEX_BITSET_MATCH_ANY); +#ifndef __ASSUME_TIME64_SYSCALLS + if (err == -ENOSYS) + err = __futex_abstimed_wait32 (futex_word, expected, + clockid, abstime, private); +#endif + switch (err) + { + case 0: + case -EAGAIN: + case -EINTR: + case -ETIMEDOUT: + return -err; + + case -EFAULT: /* Must have been caused by a glibc or application bug. */ + case -EINVAL: /* Either due to wrong alignment, unsupported + clockid or due to the timeout not being + normalized. Must have been caused by a glibc or + application bug. */ + case -ENOSYS: /* Must have been caused by a glibc bug. */ + /* No other errors are documented at this time. */ + default: + futex_fatal_error (); + } +} diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h index 7f3910ad98..1ba0d61938 100644 --- a/sysdeps/nptl/futex-internal.h +++ b/sysdeps/nptl/futex-internal.h @@ -529,4 +529,10 @@ __futex_abstimed_wait_cancelable64 (unsigned int* futex_word, const struct __timespec64* abstime, int private) attribute_hidden; +int +__futex_abstimed_wait64 (unsigned int* futex_word, unsigned int expected, + clockid_t clockid, + const struct __timespec64* abstime, + int private) attribute_hidden; + #endif /* futex-internal.h */ diff --git a/sysdeps/unix/sysv/linux/m68k/Makefile b/sysdeps/unix/sysv/linux/m68k/Makefile index be40fae68a..65164c5752 100644 --- a/sysdeps/unix/sysv/linux/m68k/Makefile +++ b/sysdeps/unix/sysv/linux/m68k/Makefile @@ -21,3 +21,5 @@ sysdep-dl-routines += dl-static sysdep-others += lddlibc4 install-bin += lddlibc4 endif + +CFLAGS-futex-internal.c += -fno-inline From patchwork Sat Sep 19 13:07:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1367573 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BtrcH0WBrz9sSW for ; Sat, 19 Sep 2020 23:08:31 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E450C386F825; Sat, 19 Sep 2020 13:08:21 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by sourceware.org (Postfix) with ESMTPS id B1A4C3870856 for ; Sat, 19 Sep 2020 13:08:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B1A4C3870856 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4Btrc15w17z1qrfh; Sat, 19 Sep 2020 15:08:17 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4Btrc14hb8z1sM9k; Sat, 19 Sep 2020 15:08:17 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id O4bgAT4Y6jPn; Sat, 19 Sep 2020 15:08:15 +0200 (CEST) X-Auth-Info: ceUIkILB58zxTEnCVhPwHJrLKxUV/NA6FdIDWSQC+yI= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Sat, 19 Sep 2020 15:08:15 +0200 (CEST) From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Subject: [PATCH v2 3/3] y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64 bit time Date: Sat, 19 Sep 2020 15:07:59 +0200 Message-Id: <20200919130759.31916-3-lukma@denx.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200919130759.31916-1-lukma@denx.de> References: <20200919130759.31916-1-lukma@denx.de> MIME-Version: 1.0 X-Spam-Status: No, score=-16.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , GNU C Library , Andreas Schwab , Stepan Golosunov , Alistair Francis Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" The pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock, pthread_rwlock_timedrdlock and pthread_rwlock_timedwrlock have been converted to support 64 bit time. This change uses new futex_abstimed_wait64 function in ./sysdeps/nptl/futex-helpers.c, which uses futex_time64 where possible. The pthread_rwlock_{clock|timed}{rd|wr}lock only accepts absolute time. Moreover, there is no need to check for NULL passed as *abstime pointer to the syscalls as those calls have exported symbols marked with __nonull attribute for abstime. For systems with __TIMESIZE != 64 && __WORDSIZE == 32: - Conversions between 64 bit time to 32 bit are necessary - Redirection to pthread_rwlock_{clock|timed}{rd|wr}lock will provide support for 64 bit time Build tests: ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Above tests were performed with Y2038 redirection applied as well as without to test the proper usage of both __pthread_rwlock_{clock|timed}{rd|wr}lock64 and __pthread_rwlock_{clock|timed}{rd|wr}lock. Reviewed-by: Alistair Francis --- Changes for v2: - None --- nptl/pthreadP.h | 18 +++++++++++++++++ nptl/pthread_rwlock_clockrdlock.c | 19 +++++++++++++++--- nptl/pthread_rwlock_clockwrlock.c | 19 +++++++++++++++--- nptl/pthread_rwlock_common.c | 33 +++++++++++++++---------------- nptl/pthread_rwlock_rdlock.c | 2 +- nptl/pthread_rwlock_timedrdlock.c | 19 +++++++++++++++--- nptl/pthread_rwlock_timedwrlock.c | 19 +++++++++++++++--- nptl/pthread_rwlock_wrlock.c | 2 +- 8 files changed, 100 insertions(+), 31 deletions(-) diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 9bb44c8535..5bcc8a2db5 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -464,6 +464,10 @@ extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); # define __pthread_timedjoin_np64 __pthread_timedjoin_np # define __pthread_cond_timedwait64 __pthread_cond_timedwait # define __pthread_cond_clockwait64 __pthread_cond_clockwait +# define __pthread_rwlock_clockrdlock64 __pthread_rwlock_clockrdlock +# define __pthread_rwlock_clockwrlock64 __pthread_rwlock_clockwrlock +# define __pthread_rwlock_timedrdlock64 __pthread_rwlock_timedrdlock +# define __pthread_rwlock_timedwrlock64 __pthread_rwlock_timedwrlock #else extern int __pthread_clockjoin_np64 (pthread_t threadid, void **thread_return, clockid_t clockid, @@ -481,6 +485,20 @@ extern int __pthread_cond_clockwait64 (pthread_cond_t *cond, clockid_t clockid, const struct __timespec64 *abstime); libpthread_hidden_proto (__pthread_cond_clockwait64) +extern int __pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock, + clockid_t clockid, + const struct __timespec64 *abstime); +libpthread_hidden_proto (__pthread_rwlock_clockrdlock64) +extern int __pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock, + clockid_t clockid, + const struct __timespec64 *abstime); +libpthread_hidden_proto (__pthread_rwlock_clockwrlock64) +extern int __pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock, + const struct __timespec64 *abstime); +libpthread_hidden_proto (__pthread_rwlock_timedrdlock64) +extern int __pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock, + const struct __timespec64 *abstime); +libpthread_hidden_proto (__pthread_rwlock_timedwrlock64) #endif extern int __pthread_cond_timedwait (pthread_cond_t *cond, diff --git a/nptl/pthread_rwlock_clockrdlock.c b/nptl/pthread_rwlock_clockrdlock.c index 4cedfd1dcd..d93b133c9e 100644 --- a/nptl/pthread_rwlock_clockrdlock.c +++ b/nptl/pthread_rwlock_clockrdlock.c @@ -21,8 +21,21 @@ /* See pthread_rwlock_common.c. */ int -pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid, - const struct timespec *abstime) +__pthread_rwlock_clockrdlock64 (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct __timespec64 *abstime) { - return __pthread_rwlock_rdlock_full (rwlock, clockid, abstime); + return __pthread_rwlock_rdlock_full64 (rwlock, clockid, abstime); } + +#if __TIMESIZE != 64 +libpthread_hidden_def (__pthread_rwlock_clockrdlock64) +int +__pthread_rwlock_clockrdlock (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct timespec *abstime) +{ + struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime); + + return __pthread_rwlock_clockrdlock64 (rwlock, clockid, &ts64); +} +#endif +weak_alias (__pthread_rwlock_clockrdlock, pthread_rwlock_clockrdlock) diff --git a/nptl/pthread_rwlock_clockwrlock.c b/nptl/pthread_rwlock_clockwrlock.c index 7a954cf529..10a314c76d 100644 --- a/nptl/pthread_rwlock_clockwrlock.c +++ b/nptl/pthread_rwlock_clockwrlock.c @@ -21,8 +21,21 @@ /* See pthread_rwlock_common.c. */ int -pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid, - const struct timespec *abstime) +__pthread_rwlock_clockwrlock64 (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct __timespec64 *abstime) { - return __pthread_rwlock_wrlock_full (rwlock, clockid, abstime); + return __pthread_rwlock_wrlock_full64 (rwlock, clockid, abstime); } + +#if __TIMESIZE != 64 +libpthread_hidden_def (__pthread_rwlock_clockwrlock64) +int +__pthread_rwlock_clockwrlock (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct timespec *abstime) +{ + struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime); + + return __pthread_rwlock_clockwrlock64 (rwlock, clockid, &ts64); +} +#endif +weak_alias (__pthread_rwlock_clockwrlock, pthread_rwlock_clockwrlock) diff --git a/nptl/pthread_rwlock_common.c b/nptl/pthread_rwlock_common.c index 3fbc66ded2..4c9f582d3d 100644 --- a/nptl/pthread_rwlock_common.c +++ b/nptl/pthread_rwlock_common.c @@ -278,9 +278,8 @@ __pthread_rwlock_rdunlock (pthread_rwlock_t *rwlock) static __always_inline int -__pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock, - clockid_t clockid, - const struct timespec *abstime) +__pthread_rwlock_rdlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct __timespec64 *abstime) { unsigned int r; @@ -330,8 +329,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock, & PTHREAD_RWLOCK_RWAITING) != 0) { int private = __pthread_rwlock_get_private (rwlock); - int err = futex_abstimed_wait (&rwlock->__data.__readers, - r, clockid, abstime, private); + int err = __futex_abstimed_wait64 (&rwlock->__data.__readers, + r, clockid, abstime, + private); /* We ignore EAGAIN and EINTR. On time-outs, we can just return because we don't need to clean up anything. */ if (err == ETIMEDOUT) @@ -457,9 +457,9 @@ __pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock, (&rwlock->__data.__wrphase_futex, &wpf, wpf | PTHREAD_RWLOCK_FUTEX_USED))) continue; - int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex, - 1 | PTHREAD_RWLOCK_FUTEX_USED, - clockid, abstime, private); + int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex, + 1 | PTHREAD_RWLOCK_FUTEX_USED, + clockid, abstime, private); if (err == ETIMEDOUT) { /* If we timed out, we need to unregister. If no read phase @@ -585,9 +585,8 @@ __pthread_rwlock_wrunlock (pthread_rwlock_t *rwlock) static __always_inline int -__pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock, - clockid_t clockid, - const struct timespec *abstime) +__pthread_rwlock_wrlock_full64 (pthread_rwlock_t *rwlock, clockid_t clockid, + const struct __timespec64 *abstime) { /* Make sure any passed in clockid and timeout value are valid. Note that the previous implementation assumed that this check *must* not be @@ -728,9 +727,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock, share the flag, and another writer will wake one of the writers in this group. */ may_share_futex_used_flag = true; - int err = futex_abstimed_wait (&rwlock->__data.__writers_futex, - 1 | PTHREAD_RWLOCK_FUTEX_USED, - clockid, abstime, private); + int err = __futex_abstimed_wait64 (&rwlock->__data.__writers_futex, + 1 | PTHREAD_RWLOCK_FUTEX_USED, + clockid, abstime, private); if (err == ETIMEDOUT) { if (prefer_writer) @@ -827,9 +826,9 @@ __pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock, (&rwlock->__data.__wrphase_futex, &wpf, PTHREAD_RWLOCK_FUTEX_USED))) continue; - int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex, - PTHREAD_RWLOCK_FUTEX_USED, - clockid, abstime, private); + int err = __futex_abstimed_wait64 (&rwlock->__data.__wrphase_futex, + PTHREAD_RWLOCK_FUTEX_USED, + clockid, abstime, private); if (err == ETIMEDOUT) { if (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP) diff --git a/nptl/pthread_rwlock_rdlock.c b/nptl/pthread_rwlock_rdlock.c index 04cecad395..2b8509a49c 100644 --- a/nptl/pthread_rwlock_rdlock.c +++ b/nptl/pthread_rwlock_rdlock.c @@ -24,7 +24,7 @@ __pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) { LIBC_PROBE (rdlock_entry, 1, rwlock); - int result = __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, NULL); + int result = __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, NULL); LIBC_PROBE (rdlock_acquire_read, 1, rwlock); return result; } diff --git a/nptl/pthread_rwlock_timedrdlock.c b/nptl/pthread_rwlock_timedrdlock.c index c5d8aee909..d5999a1419 100644 --- a/nptl/pthread_rwlock_timedrdlock.c +++ b/nptl/pthread_rwlock_timedrdlock.c @@ -20,8 +20,21 @@ /* See pthread_rwlock_common.c. */ int -pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) +__pthread_rwlock_timedrdlock64 (pthread_rwlock_t *rwlock, + const struct __timespec64 *abstime) { - return __pthread_rwlock_rdlock_full (rwlock, CLOCK_REALTIME, abstime); + return __pthread_rwlock_rdlock_full64 (rwlock, CLOCK_REALTIME, abstime); } + +#if __TIMESIZE != 64 +libpthread_hidden_def (__pthread_rwlock_timedrdlock64) +int +__pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, + const struct timespec *abstime) +{ + struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime); + + return __pthread_rwlock_timedrdlock64 (rwlock, &ts64); +} +#endif +weak_alias (__pthread_rwlock_timedrdlock, pthread_rwlock_timedrdlock) diff --git a/nptl/pthread_rwlock_timedwrlock.c b/nptl/pthread_rwlock_timedwrlock.c index ccee8b77d9..6c5284a172 100644 --- a/nptl/pthread_rwlock_timedwrlock.c +++ b/nptl/pthread_rwlock_timedwrlock.c @@ -20,8 +20,21 @@ /* See pthread_rwlock_common.c. */ int -pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) +__pthread_rwlock_timedwrlock64 (pthread_rwlock_t *rwlock, + const struct __timespec64 *abstime) { - return __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, abstime); + return __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, abstime); } + +#if __TIMESIZE != 64 +libpthread_hidden_def (__pthread_rwlock_timedwrlock64) +int +__pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, + const struct timespec *abstime) +{ + struct __timespec64 ts64 = valid_timespec_to_timespec64 (*abstime); + + return __pthread_rwlock_timedwrlock64 (rwlock, &ts64); +} +#endif +weak_alias (__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock) diff --git a/nptl/pthread_rwlock_wrlock.c b/nptl/pthread_rwlock_wrlock.c index a42aa626f0..210e6cffdc 100644 --- a/nptl/pthread_rwlock_wrlock.c +++ b/nptl/pthread_rwlock_wrlock.c @@ -24,7 +24,7 @@ __pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) { LIBC_PROBE (wrlock_entry, 1, rwlock); - int result = __pthread_rwlock_wrlock_full (rwlock, CLOCK_REALTIME, NULL); + int result = __pthread_rwlock_wrlock_full64 (rwlock, CLOCK_REALTIME, NULL); LIBC_PROBE (wrlock_acquire_write, 1, rwlock); return result; }