This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [RFC v3 04/23] sysdeps/clock_gettime: Use clock_gettime64 if avaliable
* Alistair Francis:
> 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)
I believe this needs to be updated for correctness (truncation of
tv_sec) if ever ported to architectures where __nanosleep_nocancel takes
a 32-bit time_t argument. I don't know what our plans are regarding to
that.
If you had
#define __NR_clock_gettime64 __NR_clock_gettime
in <sysdep.h>, you wouldn't need this change.
> 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;
> +}
I think this has the same problems as the timespec_get patch.
Thanks,
Florian