diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-10-24 21:01:40 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-10-30 17:11:10 -0300 |
commit | f9a7554009cf38f390e74fcabc5b49f974f72382 (patch) | |
tree | b8e5b100ca6f2bc18ff0b134d48c9e26e83325ba /sysdeps | |
parent | 0d563783490bf5b2d7d52cab205760fdff5d5650 (diff) | |
download | glibc-f9a7554009cf38f390e74fcabc5b49f974f72382.tar.gz glibc-f9a7554009cf38f390e74fcabc5b49f974f72382.tar.xz glibc-f9a7554009cf38f390e74fcabc5b49f974f72382.zip |
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 <lukma@denx.de>
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/check_native.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/check_pf.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getsysstats.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/time.c | 34 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ifaddrs.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/time.c | 71 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86/time.c | 34 |
7 files changed, 35 insertions, 112 deletions
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 - <https://www.gnu.org/licenses/>. */ - -#ifdef SHARED -# define time __redirect_time -#endif - -#include <time.h> - -#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 <sysdeps/unix/sysv/linux/x86/time.c> 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 <https://www.gnu.org/licenses/>. */ -#ifdef SHARED -# ifndef __powerpc64__ -# define time __redirect_time -# else -# define __redirect_time time -# endif - -# include <time.h> -# include <sysdep.h> -# include <dl-vdso.h> -# include <libc-vdso.h> -# include <dl-machine.h> +#include <time.h> +#include <sysdep.h> -# ifndef __powerpc64__ -# undef time +#ifdef HAVE_TIME_VSYSCALL +# define HAVE_VSYSCALL +#endif +#include <sysdep-vdso.h> -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 <dl-vdso.h> +# include <libc-vdso.h> # 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 <time/time.c> - +time_t +time (time_t *t) +{ + return time_vsyscall (t); +} #endif /* !SHARED */ diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c index 2e47661be3..4a03c46d21 100644 --- a/sysdeps/unix/sysv/linux/x86/time.c +++ b/sysdeps/unix/sysv/linux/x86/time.c @@ -17,43 +17,31 @@ <https://www.gnu.org/licenses/>. */ #include <time.h> +#include <sysdep.h> -#ifdef SHARED - -#include <dl-vdso.h> -#include <errno.h> +#ifdef HAVE_TIME_VSYSCALL +# define HAVE_VSYSCALL +#endif #include <sysdep-vdso.h> static time_t -__time_syscall (time_t *t) +time_vsyscall (time_t *t) { - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (time, err, 1, t); + return INLINE_VSYSCALL (time, 1, t); } -# ifndef time_type -/* The i386 time.c includes this file with a defined time_type macro. - For x86_64 we have to define it to time as the internal symbol is the - ifunc'ed one. */ -# define time_type time -# endif +#ifdef SHARED +# include <dl-vdso.h> +# include <libc-vdso.h> #undef INIT_ARCH #define INIT_ARCH() /* If the vDSO is not available we fall back on the syscall. */ -libc_ifunc_hidden (time_type, time, - (get_vdso_symbol ("__vdso_time") ?: __time_syscall)) -libc_hidden_def (time) - +libc_ifunc (time, (get_vdso_symbol ("__vdso_time") ?: time_vsyscall)) #else - -# include <sysdep.h> - time_t time (time_t *t) { - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (time, err, 1, t); + return time_vsyscall (t); } - #endif |