From f9a7554009cf38f390e74fcabc5b49f974f72382 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 24 Oct 2019 21:01:40 +0000 Subject: Change most internal uses of time to __clock_gettime. As for gettimeofday, time will be implemented based on clock_gettime on all platforms and internal code should use clock_gettime directly. In addition to removing a layer of indirection, this will allow us to remove the PLT-bypass gunk for gettimeofday. The changed code always assumes __clock_gettime (CLOCK_REALTIME) or __clock_gettime (CLOCK_REALTIME_COARSE) (for Linux case) cannot fail, using the same rationale for gettimeofday change. And internal helper was added (time_now). Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, powerpc64-linux-gnu, and powerpc-linux-gnu. Reviewed-by: Lukasz Majewski --- sysdeps/unix/sysv/linux/check_native.c | 2 +- sysdeps/unix/sysv/linux/check_pf.c | 2 +- sysdeps/unix/sysv/linux/getsysstats.c | 2 +- sysdeps/unix/sysv/linux/i386/time.c | 34 ---------------- sysdeps/unix/sysv/linux/ifaddrs.c | 2 +- sysdeps/unix/sysv/linux/powerpc/time.c | 71 ++++++++++------------------------ sysdeps/unix/sysv/linux/x86/time.c | 34 ++++++---------- 7 files changed, 35 insertions(+), 112 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/i386/time.c (limited to 'sysdeps/unix/sysv/linux') diff --git a/sysdeps/unix/sysv/linux/check_native.c b/sysdeps/unix/sysv/linux/check_native.c index 3e57629d8c..82e2a0d83f 100644 --- a/sysdeps/unix/sysv/linux/check_native.c +++ b/sysdeps/unix/sysv/linux/check_native.c @@ -69,7 +69,7 @@ __check_native (uint32_t a1_index, int *a1_native, req.nlh.nlmsg_type = RTM_GETLINK; req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; req.nlh.nlmsg_pid = 0; - req.nlh.nlmsg_seq = time (NULL); + req.nlh.nlmsg_seq = time_now (); req.g.rtgen_family = AF_UNSPEC; assert (sizeof (req) - offsetof (struct req, pad) == 3); diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 97a30f63fc..bcb9c602aa 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -126,7 +126,7 @@ make_request (int fd, pid_t pid) req.nlh.nlmsg_type = RTM_GETADDR; req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; req.nlh.nlmsg_pid = 0; - req.nlh.nlmsg_seq = time (NULL); + req.nlh.nlmsg_seq = time_now (); req.g.rtgen_family = AF_UNSPEC; assert (sizeof (req) - offsetof (struct req, pad) == 3); diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c index 41ceb9a320..6457193227 100644 --- a/sysdeps/unix/sysv/linux/getsysstats.c +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -128,7 +128,7 @@ __get_nprocs (void) static int cached_result = -1; static time_t timestamp; - time_t now = time (NULL); + time_t now = time_now (); time_t prev = timestamp; atomic_read_barrier (); if (now == prev && cached_result > -1) diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c deleted file mode 100644 index 1bbe079f65..0000000000 --- a/sysdeps/unix/sysv/linux/i386/time.c +++ /dev/null @@ -1,34 +0,0 @@ -/* time -- Get number of seconds since Epoch. Linux/i386 version. - Copyright (C) 2015-2019 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifdef SHARED -# define time __redirect_time -#endif - -#include - -#ifdef SHARED -# undef time -# define time_type __redirect_time - -# undef libc_hidden_def -# define libc_hidden_def(name) \ - __hidden_ver1 (__time_syscall, __GI_time, __time_syscall); -#endif - -#include diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c index 0c36001660..2b89c7a3af 100644 --- a/sysdeps/unix/sysv/linux/ifaddrs.c +++ b/sysdeps/unix/sysv/linux/ifaddrs.c @@ -102,7 +102,7 @@ __netlink_sendreq (struct netlink_handle *h, int type) struct sockaddr_nl nladdr; if (h->seq == 0) - h->seq = time (NULL); + h->seq = time_now (); req.nlh.nlmsg_len = sizeof (req); req.nlh.nlmsg_type = type; diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c index e957b81751..80a4c73416 100644 --- a/sysdeps/unix/sysv/linux/powerpc/time.c +++ b/sysdeps/unix/sysv/linux/powerpc/time.c @@ -16,68 +16,37 @@ License along with the GNU C Library; if not, see . */ -#ifdef SHARED -# ifndef __powerpc64__ -# define time __redirect_time -# else -# define __redirect_time time -# endif - -# include -# include -# include -# include -# include +#include +#include -# ifndef __powerpc64__ -# undef time +#ifdef HAVE_TIME_VSYSCALL +# define HAVE_VSYSCALL +#endif +#include -time_t -__time_vsyscall (time_t *t) +static time_t +time_vsyscall (time_t *t) { return INLINE_VSYSCALL (time, 1, t); } -/* __GI_time is defined as hidden and for ppc32 it enables the - compiler make a local call (symbol@local) for internal GLIBC usage. It - means the PLT won't be used and the ifunc resolver will be called directly. - For ppc64 a call to a function in another translation unit might use a - different toc pointer thus disallowing direct branchess and making internal - ifuncs calls safe. */ -# undef libc_hidden_def -# define libc_hidden_def(name) \ - __hidden_ver1 (__time_vsyscall, __GI_time, __time_vsyscall); - -# endif /* !__powerpc64__ */ - -static time_t -time_syscall (time_t *t) -{ - struct timeval tv; - time_t result; - - if (INLINE_VSYSCALL (gettimeofday, 2, &tv, NULL) < 0) - result = (time_t) -1; - else - result = (time_t) tv.tv_sec; - - if (t != NULL) - *t = result; - return result; -} +#ifdef SHARED +# include +# include # define INIT_ARCH() \ void *vdso_time = get_vdso_symbol (HAVE_TIME_VSYSCALL); /* If the vDSO is not available we fall back to the syscall. */ -libc_ifunc_hidden (__redirect_time, time, - vdso_time - ? VDSO_IFUNC_RET (vdso_time) - : (void *) time_syscall); -libc_hidden_def (time) +libc_ifunc (time, + vdso_time + ? VDSO_IFUNC_RET (vdso_time) + : (void *) time_vsyscall); #else - -#include