This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [RFC v2 07/20] sysdeps/gettimeofday: Use clock_gettime64 if avaliable
On 24/06/2019 21:09, Alistair Francis wrote:
> Not all architectures support the obsolete gettimeofday so use the
> newer clock_gettime64 syscall if it is avaliable. This fixes RV32
> build issues.
>
> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
> ---
> ChangeLog | 1 +
> sysdeps/unix/sysv/linux/gettimeofday.c | 28 ++++++++++++++++++++++++++
> 2 files changed, 29 insertions(+)
>
> diff --git a/ChangeLog b/ChangeLog
> index a700783ef3..f1c7acb6ab 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -4,6 +4,7 @@
> * sysdeps/unix/sysv/linux/nanosleep.c: Likewise.
> * sysdeps/unix/sysv/linux/nanosleep_nocancel.c: Likewise.
> * sysdeps/unix/sysv/linux/lowlevellock-futex.h: Use __NR_futex_time64 if we don't have __NR_futex.
> + * sysdeps/unix/sysv/linux/gettimeofday.c: Use clock_gettime64 syscall for gettimeofday.
>
> 2019-06-20 Dmitry V. Levin <ldv@altlinux.org>
> Florian Weimer <fweimer@redhat.com>
> diff --git a/sysdeps/unix/sysv/linux/gettimeofday.c b/sysdeps/unix/sysv/linux/gettimeofday.c
> index a74f03825a..3d2b943123 100644
> --- a/sysdeps/unix/sysv/linux/gettimeofday.c
> +++ b/sysdeps/unix/sysv/linux/gettimeofday.c
> @@ -32,7 +32,35 @@
> int
> __gettimeofday (struct timeval *tv, struct timezone *tz)
> {
> +#ifdef __ASSUME_TIME64_SYSCALLS
> + int ret;
> + struct timespec now;
> +
> + ret = INLINE_VSYSCALL (clock_gettime64, 2, CLOCK_REALTIME,
> + &now);
> +
> + /* Convert from timespec to timeval */
> + tv->tv_sec = now.tv_sec;
> + tv->tv_usec = now.tv_nsec / 1000;
> +
> + return ret;
> +#else
> +# ifdef __NR_clock_gettime64
> + long int ret;
> + struct timespec now;
> +
> + ret = INLINE_VSYSCALL (clock_gettime64, 2, CLOCK_REALTIME,
> + &now);
> +
> + /* Convert from timespec to timeval */
> + tv->tv_sec = now.tv_sec;
> + tv->tv_usec = now.tv_nsec / 1000;
> +
> + if (ret == 0 || errno != ENOSYS)
> + return ret;
> +# endif
> return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
> +#endif
> }
> libc_hidden_def (__gettimeofday)
> weak_alias (__gettimeofday, gettimeofday)
>
Wouldn't be simpler to just call __clock_gettime instead:
--
__gettimeofday (struct timeval *tv, struct timezone *tz)
{
if (tv == NULL)
return 0;
struct timespec ts;
__clock_gettime (CLOCK_REALTIME, &ts);
tv->tv_sec = ts.tv_sec;
tv->tv_usec = (__suseconds_t)ts.tv_nsec / 1000;
return 0;
}
--
>From the patch 'linux: Provide __clock_settime64 implementation' internal
include/time.h will redefine __clock_gettime to __clock_gettime64 if the
case.