This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[RFC v3 04/23] sysdeps/clock_gettime: Use clock_gettime64 if avaliable
- From: Alistair Francis <alistair dot francis at wdc dot com>
- To: libc-alpha at sourceware dot org
- Cc: arnd at arndb dot de, adhemerval dot zanella at linaro dot org, fweimer at redhat dot com, palmer at sifive dot com, macro at wdc dot com, zongbox at gmail dot com, alistair dot francis at wdc dot com, alistair23 at gmail dot com
- Date: Tue, 16 Jul 2019 17:08:51 -0700
- Subject: [RFC v3 04/23] sysdeps/clock_gettime: Use clock_gettime64 if avaliable
- Ironport-sdr: AEmiGnllEmj0W/yQ0md8/Lh/aV7tmMvQEnCiSx6znzVPGxhE4lNNOmvC45VQHh9K7Jdr9vEz5w Di+p2tOtfXV4Kvvo8Aitu/H8XPqSVzi1LmDsRAEO8NFJeZ8WQDtNqmryjANF5HHEubSd0dT1xB gQxYiF9iMZNcCgJz+TkTH644oMjQiGV9ZmI9TsPr/M6OcJcidxwL1THZZ9ErSOKTUCc/6pJNWc /f3i97NVrHlB73X+m4F9Rfx56BjEuJj2dgcU3QL2FURX7f7zlg5wQJfzItVxYo0mBNyBPrKrSs RV0=
- Ironport-sdr: Gl6mXgwMymifJdbyb7ZkkosaoKtS8SR5Eygh1J1/yLhk0B7E4nCtwAW/mR61jWvujPqkW466JE qFJNjzlaRKT4lmorhaw2GIR9tllHCuwaHBVFeS9KR354ge4crGmT8MK/1o64UUxMYyZsMG4rmq 1sdH4aDBRf84WwnAZcXLkoqaJGrLjdVhzCGGcvC9uvlhwf/9wIqVyANhg1p/rvxLKl3wrdtw/y 1ozo9K+g4QXw0Vy0WZm6a2v+qYGmi+CsHjAZDVEA9/T4IUcUVb7fazQO+wgktpLwZBhAscfo2Q Xdxz1g2TRRdaxepK1WhaPMAN
- Ironport-sdr: 9DZs/PNUDNHwl/8E8QB7KTSXg3p1dPJQGzBLborV10Z7e9QDpv3bN/50E5WI3gwIF6JvTGlwMQ dbxl5pY0qujBG+iGvlK4VG9xHUb9mdgBae7stXy04DotdFzPf4DOswv4xSRz+1vFqT1CJYNnp1 Owdz0j7XXrRme5h2eQyvS0Tykr/Gw1Ryr3896PAnyHYtLOcrZa+mtN4E+Si1hluAasCCNYWNFX rMNfjqnIgKdVlzKNsDhDrnBoVljmgZ7Sx7HX/Dp0OI2/1viqwrYp1QIIsUOBLP0ZFBSvCbTHFU Hso=
- References: <cover.1563321715.git.alistair.francis@wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
nptl/pthread_mutex_timedlock.c | 7 ++++++
sysdeps/unix/sysv/linux/clock_gettime.c | 30 +++++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c
index 52c258e33d..8d9cae7d87 100644
--- a/nptl/pthread_mutex_timedlock.c
+++ b/nptl/pthread_mutex_timedlock.c
@@ -402,10 +402,17 @@ __pthread_mutex_clocklock_common (pthread_mutex_t *mutex,
/* Delay the thread until the timeout is reached.
Then return ETIMEDOUT. */
struct timespec reltime;
+#ifdef __NR_clock_gettime64
+ struct __timespec64 now;
+
+ INTERNAL_SYSCALL (clock_gettime64, __err, 2, CLOCK_REALTIME,
+ &now);
+#else
struct timespec now;
INTERNAL_SYSCALL (clock_gettime, __err, 2, clockid,
&now);
+#endif
reltime.tv_sec = abstime->tv_sec - now.tv_sec;
reltime.tv_nsec = abstime->tv_nsec - now.tv_nsec;
if (reltime.tv_nsec < 0)
diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c
index 5fc47fb7dc..4832069c34 100644
--- a/sysdeps/unix/sysv/linux/clock_gettime.c
+++ b/sysdeps/unix/sysv/linux/clock_gettime.c
@@ -27,10 +27,40 @@
#include <sysdep-vdso.h>
/* Get current value of CLOCK and store it in TP. */
+
+#if __WORDSIZE == 32
+int
+__clock_gettime (clockid_t clock_id, struct timespec *tp)
+{
+ int ret;
+
+#ifdef __NR_clock_gettime64
+ struct __timespec64 tp64;
+ ret = INLINE_VSYSCALL (clock_gettime64, 2, clock_id, &tp64);
+
+ 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;
+ }
+#endif
+
+#ifndef __ASSUME_TIME64_SYSCALLS
+ ret = INLINE_VSYSCALL (clock_gettime, 2, clock_id, tp);
+#endif
+
+ return ret;
+}
+#else
int
__clock_gettime (clockid_t clock_id, struct timespec *tp)
{
return INLINE_VSYSCALL (clock_gettime, 2, clock_id, tp);
}
+#endif
+
weak_alias (__clock_gettime, clock_gettime)
libc_hidden_def (__clock_gettime)
--
2.22.0