From patchwork Sat Aug 10 01:00:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 34032 Received: (qmail 72649 invoked by alias); 10 Aug 2019 01:03:22 -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 72596 invoked by uid 89); 10 Aug 2019 01:03:22 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= X-HELO: esa6.hgst.iphmx.com DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1565399001; x=1596935001; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1rvxKODbWPcpBq1iaXMwGYeb9bt/lzo576qECBEe1AA=; b=kuL0sOVGGxRcJRgm1FV75F6p5HNohE951A2TA03ANTgTB7zH8UttdYDv 47rMBNXA60aOA5Ro1HywitDOkpw64HBann1HClLIirJrFT9IZPiFsdkmc +Z/rhk1wdrnO57Yr5gyZsWBiXBwQqR4Un4ObCSUTuzu82REEzv0IocWPW VikwH+6Wjaz5Lf7IGtX9AqkHYNrXClSwjZOFyTWezRIrWqVtDxuWpTUAb Q0Y9CMJP0a7KYbSl4PHC70wYcw4L5VsBreCur4LD/nXVB0VzTnECxjLLj G7ZnztnUlfSvFtkqWbP0FM8OS2eI88GxtkJiUWq/6opj+NclhUJw21KUX w==; IronPort-SDR: bJZahOpQtc/FTq62EMz/ZVgxj0LQKIP0btWp8OHWji2RopPDEdQ1T+slMG9udFLzKDw7j+jyE7 6u4QX3gubeXi5e1wv1iUkiv4HNZrMbvdJZbTj1YpSdb/SAS4VILeaBaeNGDw/WIRTJ3bpB34FW 0RcW+DUlKxBXcZFZWQfvtNJ+Pyg4AtU9xNhxrptXlbujGodMcIYFy7M+HNTIVjPX289QSX9yxG z3V/ttN0whlw/6zMk2X9nD6+8fiXQJvKAL6zSP1alqG0C3xR4tCzwXsh4nuBo52t2DSxBegQUF mnA= IronPort-SDR: JXSUpH/EgKI+VfValmhLzm656k1NgAJ133UKE5GdI3TWfjMFwUuPqp+SVbnQsoeAz1PMYS7Htu BW9KDOADJcVf7seZcKESIKYzxUakjIKCmUguGFnP2nkTj2Qf7XawU6fC2aymWFF/gY6ayp9VvT YSEQLQuUrvwf8Av0lFi/KzlTRgPOk5naTjPl/oDod+SuHlZiPutcbubhRlM0mLykWx/wRQ7CpA Np8AazXP3WcZjQT6Zhyl9pA7n3jfw6ZOg/TQKj9I8SnBU7GOY6j+ciyzF0s93DkYsTLnljm+on fnkAVDtjEiw6WBRWpE78FQan IronPort-SDR: RtcpbyiPFi+Vrc6S7ThJanQ0yR78lh48VrXjEKrcNQOnNAz9n2Nx8D7lIyeh9rBp+sQHTPwXHm BOOIggb2xRhewn1kwwSdGs+UsVOs//0MubS+ghSBYbjl3uoT9muyWLfKcXdVUvyAoRR8Doj+DF zIwk/0qc5uO9DJufOQ+wQvtENBe9NT8VclIDTzK0LzM3+ttGDVyC6sHruQHzUh32hLxuRSvvCq Gfbr7reIrD0/Z3KDo4IihxCCkOPkiLsFZqg9rZ+mmRHQjE2HwLguG9o/deQIjyv8CQlee5/3VC XIo= From: Alistair Francis To: libc-alpha@sourceware.org Cc: arnd@arndb.de, adhemerval.zanella@linaro.org, fweimer@redhat.com, palmer@sifive.com, macro@wdc.com, zongbox@gmail.com, alistair.francis@wdc.com, alistair23@gmail.com Subject: [RFC v4 05/24] sysdeps/clock_gettime: Use clock_gettime64 if avaliable Date: Fri, 9 Aug 2019 18:00:00 -0700 Message-Id: <84b269f1c4a8633e01bd623c07080143c70b785e.1565398513.git.alistair.francis@wdc.com> In-Reply-To: References: MIME-Version: 1.0 Signed-off-by: Alistair Francis --- sysdeps/unix/sysv/linux/clock_gettime.c | 62 ++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c index 5fc47fb7dc7..c090797e461 100644 --- a/sysdeps/unix/sysv/linux/clock_gettime.c +++ b/sysdeps/unix/sysv/linux/clock_gettime.c @@ -27,10 +27,70 @@ #include /* Get current value of CLOCK and store it in TP. */ + int __clock_gettime (clockid_t clock_id, struct timespec *tp) { - return INLINE_VSYSCALL (clock_gettime, 2, clock_id, tp); + +#ifdef __ASSUME_TIME64_SYSCALLS + return INLINE_VSYSCALL (clock_gettime64, 2, clock_id, tp); +#else + int ret; +# ifdef __NR_clock_gettime64 +# if __TIMESIZE == 64 + ret = INLINE_VSYSCALL (clock_gettime64, 2, clock_id, tp); + + if (ret == 0 || errno != ENOSYS) + { + return ret; + } +# else + struct __timespec64 tp64; + ret = INLINE_VSYSCALL (clock_gettime64, 2, clock_id, &tp64); + + if (ret == 0 || errno != ENOSYS) + { + tp->tv_sec = tp64.tv_sec; + tp->tv_nsec = tp64.tv_nsec; + if (! in_time_t_range (tp->tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + return 0; + } +# endif /* __TIMESIZE == 64 */ +# endif /* __NR_clock_gettime64 */ +# if __TIMESIZE == 64 + struct timespec ts32; + + if (! in_time_t_range (tp->tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + ret = INLINE_VSYSCALL (clock_gettime, 2, clock_id, &ts32); + + if (ret == 0 || errno != ENOSYS) + { + tp->tv_sec = ts32.tv_sec; + tp->tv_nsec = ts32.tv_nsec; + if (! in_time_t_range (tp->tv_sec)) + { + __set_errno (EOVERFLOW); + return -1; + } + + return 0; + } + return ret; +# else + return INLINE_VSYSCALL (clock_gettime, 2, clock_id, tp); +# endif /* __TIMESIZE == 64 */ +#endif /* __ASSUME_TIME64_SYSCALLS */ } + weak_alias (__clock_gettime, clock_gettime) libc_hidden_def (__clock_gettime)