From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: Re: [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime
Date: Tue, 19 Mar 2019 14:23:59 -0300 [thread overview]
Message-ID: <5a213c63-a2ef-9d43-bdd3-95608fd0db68@linaro.org> (raw)
In-Reply-To: <20190218211128.1869-1-adhemerval.zanella@linaro.org>
Ping.
On 18/02/2019 18:11, Adhemerval Zanella wrote:
> This patch removes CLOCK_THREAD_CPUTIME_ID and CLOCK_PROCESS_CPUTIME_ID support
> from clock_gettime and clock_settime generic implementation. For Linux, kernel
> already provides supports through the syscall and Hurd HTL lacks
> __pthread_clock_gettime and __pthread_clock_settime internal implementation.
>
> As described in clock_gettime man-page [1] on 'Historical note for SMP
> system', implementing CLOCK_{THREAD,PROCESS}_CPUTIME_ID with timer registers
> is error-prone and susceptible to timing and accurary issues that the libc
> can not deal without kernel support.
>
> This allows removes unused code which, however, still incur in some runtime
> overhead in thread creation (the struct pthread cpuclock_offset
> initialization).
>
> If hurd eventually wants to support them it should either either implement as
> a kernel facility (or something related due its architecture) or in system
> specific implementation.
>
> Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. I also
> checked on a i686-gnu build.
>
> * nptl/Makefile (libpthread-routines): Remove pthread_clock_gettime and
> pthread_clock_settime.
> * nptl/pthreadP.h (__find_thread_by_id): Remove prototype.
> * elf/dl-support.c [!HP_TIMING_NOAVAIL] (_dl_cpuclock_offset): Remove.
> (_dl_non_dynamic_init): Remove _dl_cpuclock_offset setting.
> * elf/rtld.c (_dl_start_final): Likewise.
> * nptl/allocatestack.c (__find_thread_by_id): Remove function.
> * sysdeps/generic/ldsodefs.h [!HP_TIMING_NOAVAIL] (_dl_cpuclock_offset):
> Remove.
> * sysdeps/mach/hurd/dl-sysdep.c [!HP_TIMING_NOAVAIL]
> (_dl_cpuclock_offset): Remove.
> * nptl/descr.h (struct pthread): Rename cpuclock_offset to
> cpuclock_offset_ununsed.
> * nptl/nptl-init.c (__pthread_initialize_minimal_internal): Remove
> cpuclock_offset set.
> * nptl/pthread_create.c (START_THREAD_DEFN): Likewise.
> * sysdeps/nptl/fork.c (__libc_fork): Likewise.
> * nptl/pthread_clock_gettime.c: Remove file.
> * nptl/pthread_clock_settime.c: Likewise.
> * sysdeps/unix/clock_gettime.c (hp_timing_gettime): Remove function.
> [HP_TIMING_AVAIL] (realtime_gettime): Remove CLOCK_THREAD_CPUTIME_ID
> and CLOCK_PROCESS_CPUTIME_ID support.
> * sysdeps/unix/clock_settime.c (hp_timing_gettime): Likewise.
> [HP_TIMING_AVAIL] (realtime_gettime): Likewise.
> * sysdeps/posix/clock_getres.c (hp_timing_getres): Likewise.
> [HP_TIMING_AVAIL] (__clock_getres): Likewise.
> * sysdeps/unix/clock_nanosleep.c (CPUCLOCK_P, INVALID_CLOCK_P):
> Likewise.
> (__clock_nanosleep): Remove CPUCLOCK_P and INVALID_CLOCK_P usage.
>
> [1] http://man7.org/linux/man-pages/man2/clock_gettime.2.html
> ---
> elf/dl-support.c | 8 ----
> elf/rtld.c | 2 -
> nptl/Makefile | 1 -
> nptl/allocatestack.c | 48 ------------------------
> nptl/descr.h | 3 +-
> nptl/nptl-init.c | 3 --
> nptl/pthreadP.h | 10 -----
> nptl/pthread_clock_gettime.c | 67 ----------------------------------
> nptl/pthread_clock_settime.c | 54 ---------------------------
> nptl/pthread_create.c | 7 ----
> sysdeps/generic/ldsodefs.h | 5 ---
> sysdeps/mach/hurd/dl-sysdep.c | 8 ----
> sysdeps/nptl/fork.c | 8 ----
> sysdeps/posix/clock_getres.c | 46 +----------------------
> sysdeps/unix/clock_gettime.c | 65 +--------------------------------
> sysdeps/unix/clock_nanosleep.c | 30 ++-------------
> sysdeps/unix/clock_settime.c | 61 +------------------------------
> 17 files changed, 9 insertions(+), 417 deletions(-)
> delete mode 100644 nptl/pthread_clock_gettime.c
> delete mode 100644 nptl/pthread_clock_settime.c
>
> diff --git a/elf/dl-support.c b/elf/dl-support.c
> index 42c350c75d..0a8b636d02 100644
> --- a/elf/dl-support.c
> +++ b/elf/dl-support.c
> @@ -129,11 +129,6 @@ void *_dl_random;
> #include <dl-procruntime.c>
> #include <dl-procinfo.c>
>
> -/* Initial value of the CPU clock. */
> -#ifndef HP_TIMING_NONAVAIL
> -hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
> void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
>
> size_t _dl_pagesize = EXEC_PAGESIZE;
> @@ -314,9 +309,6 @@ _dl_non_dynamic_init (void)
> _dl_main_map.l_phdr = GL(dl_phdr);
> _dl_main_map.l_phnum = GL(dl_phnum);
>
> - if (HP_SMALL_TIMING_AVAIL)
> - HP_TIMING_NOW (_dl_cpuclock_offset);
> -
> _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
>
> /* Set up the data structures for the system-supplied DSO early,
> diff --git a/elf/rtld.c b/elf/rtld.c
> index c1cc1b01f2..1f124b31fc 100644
> --- a/elf/rtld.c
> +++ b/elf/rtld.c
> @@ -403,8 +403,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
> # endif
> #endif
>
> - HP_TIMING_NOW (GL(dl_cpuclock_offset));
> -
> /* Initialize the stack end variable. */
> __libc_stack_end = __builtin_frame_address (0);
>
> diff --git a/nptl/Makefile b/nptl/Makefile
> index 5acfdcceff..f9bc5cc887 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -109,7 +109,6 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
> pthread_once \
> old_pthread_atfork \
> pthread_getcpuclockid \
> - pthread_clock_gettime pthread_clock_settime \
> shm-directory \
> sem_init sem_destroy \
> sem_open sem_close sem_unlink \
> diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
> index d8e8570a7d..fcbc46f0d7 100644
> --- a/nptl/allocatestack.c
> +++ b/nptl/allocatestack.c
> @@ -963,54 +963,6 @@ __reclaim_stacks (void)
> }
>
>
> -#if HP_TIMING_AVAIL
> -# undef __find_thread_by_id
> -/* Find a thread given the thread ID. */
> -attribute_hidden
> -struct pthread *
> -__find_thread_by_id (pid_t tid)
> -{
> - struct pthread *result = NULL;
> -
> - lll_lock (stack_cache_lock, LLL_PRIVATE);
> -
> - /* Iterate over the list with system-allocated threads first. */
> - list_t *runp;
> - list_for_each (runp, &stack_used)
> - {
> - struct pthread *curp;
> -
> - curp = list_entry (runp, struct pthread, list);
> -
> - if (curp->tid == tid)
> - {
> - result = curp;
> - goto out;
> - }
> - }
> -
> - /* Now the list with threads using user-allocated stacks. */
> - list_for_each (runp, &__stack_user)
> - {
> - struct pthread *curp;
> -
> - curp = list_entry (runp, struct pthread, list);
> -
> - if (curp->tid == tid)
> - {
> - result = curp;
> - goto out;
> - }
> - }
> -
> - out:
> - lll_unlock (stack_cache_lock, LLL_PRIVATE);
> -
> - return result;
> -}
> -#endif
> -
> -
> #ifdef SIGSETXID
> static void
> setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
> diff --git a/nptl/descr.h b/nptl/descr.h
> index 4ef33ae465..cb7d4c2282 100644
> --- a/nptl/descr.h
> +++ b/nptl/descr.h
> @@ -343,8 +343,7 @@ struct pthread
> unsigned int setxid_futex;
>
> #if HP_TIMING_AVAIL
> - /* Offset of the CPU clock at start thread start time. */
> - hp_timing_t cpuclock_offset;
> + hp_timing_t cpuclock_offset_ununsed;
> #endif
>
> /* If the thread waits to join another one the ID of the latter is
> diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
> index b5895fabf3..6691211e4e 100644
> --- a/nptl/nptl-init.c
> +++ b/nptl/nptl-init.c
> @@ -276,9 +276,6 @@ __pthread_initialize_minimal_internal (void)
> THREAD_SETMEM (pd, user_stack, true);
> if (LLL_LOCK_INITIALIZER != 0)
> THREAD_SETMEM (pd, lock, LLL_LOCK_INITIALIZER);
> -#if HP_TIMING_AVAIL
> - THREAD_SETMEM (pd, cpuclock_offset, GL(dl_cpuclock_offset));
> -#endif
>
> /* Initialize the robust mutex data. */
> {
> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
> index 626bd4b096..f0facfdb7d 100644
> --- a/nptl/pthreadP.h
> +++ b/nptl/pthreadP.h
> @@ -401,16 +401,6 @@ extern int __pthread_multiple_threads attribute_hidden;
> extern int *__libc_multiple_threads_ptr attribute_hidden;
> #endif
>
> -/* Find a thread given its TID. */
> -extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden
> -#ifdef SHARED
> -;
> -#else
> -weak_function;
> -#define __find_thread_by_id(tid) \
> - (__find_thread_by_id ? (__find_thread_by_id) (tid) : (struct pthread *) NULL)
> -#endif
> -
> extern void __pthread_init_static_tls (struct link_map *) attribute_hidden;
>
> extern size_t __pthread_get_minstack (const pthread_attr_t *attr);
> diff --git a/nptl/pthread_clock_gettime.c b/nptl/pthread_clock_gettime.c
> deleted file mode 100644
> index f1d9104b24..0000000000
> --- a/nptl/pthread_clock_gettime.c
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* Copyright (C) 2001-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; see the file COPYING.LIB. If
> - not, see <http://www.gnu.org/licenses/>. */
> -
> -#include <errno.h>
> -#include <stdlib.h>
> -#include <time.h>
> -#include "pthreadP.h"
> -
> -
> -#if HP_TIMING_AVAIL
> -int
> -__pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq,
> - struct timespec *tp)
> -{
> - hp_timing_t tsc;
> -
> - /* Get the current counter. */
> - HP_TIMING_NOW (tsc);
> -
> - /* This is the ID of the thread we are looking for. */
> - pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
> -
> - /* Compute the offset since the start time of the process. */
> - if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid))
> - /* Our own clock. */
> - tsc -= THREAD_GETMEM (THREAD_SELF, cpuclock_offset);
> - else
> - {
> - /* This is more complicated. We have to locate the thread based
> - on the ID. This means walking the list of existing
> - threads. */
> - struct pthread *thread = __find_thread_by_id (tid);
> - if (thread == NULL)
> - {
> - __set_errno (EINVAL);
> - return -1;
> - }
> -
> - /* There is a race here. The thread might terminate and the stack
> - become unusable. But this is the user's problem. */
> - tsc -= thread->cpuclock_offset;
> - }
> -
> - /* Compute the seconds. */
> - tp->tv_sec = tsc / freq;
> -
> - /* And the nanoseconds. This computation should be stable until
> - we get machines with about 16GHz frequency. */
> - tp->tv_nsec = ((tsc % freq) * 1000000000ull) / freq;
> -
> - return 0;
> -}
> -#endif
> diff --git a/nptl/pthread_clock_settime.c b/nptl/pthread_clock_settime.c
> deleted file mode 100644
> index 0fe6482f78..0000000000
> --- a/nptl/pthread_clock_settime.c
> +++ /dev/null
> @@ -1,54 +0,0 @@
> -/* Copyright (C) 2001-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; see the file COPYING.LIB. If
> - not, see <http://www.gnu.org/licenses/>. */
> -
> -#include <errno.h>
> -#include <stdlib.h>
> -#include <time.h>
> -#include "pthreadP.h"
> -
> -
> -#if HP_TIMING_AVAIL
> -int
> -__pthread_clock_settime (clockid_t clock_id, hp_timing_t offset)
> -{
> - /* This is the ID of the thread we are looking for. */
> - pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
> -
> - /* Compute the offset since the start time of the process. */
> - if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid))
> - /* Our own clock. */
> - THREAD_SETMEM (THREAD_SELF, cpuclock_offset, offset);
> - else
> - {
> - /* This is more complicated. We have to locate the thread based
> - on the ID. This means walking the list of existing
> - threads. */
> - struct pthread *thread = __find_thread_by_id (tid);
> - if (thread == NULL)
> - {
> - __set_errno (EINVAL);
> - return -1;
> - }
> -
> - /* There is a race here. The thread might terminate and the stack
> - become unusable. But this is the user's problem. */
> - thread->cpuclock_offset = offset;
> - }
> -
> - return 0;
> -}
> -#endif
> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
> index 2bd2b10727..18b7bbe765 100644
> --- a/nptl/pthread_create.c
> +++ b/nptl/pthread_create.c
> @@ -379,13 +379,6 @@ START_THREAD_DEFN
> {
> struct pthread *pd = START_THREAD_SELF;
>
> -#if HP_TIMING_AVAIL
> - /* Remember the time when the thread was started. */
> - hp_timing_t now;
> - HP_TIMING_NOW (now);
> - THREAD_SETMEM (pd, cpuclock_offset, now);
> -#endif
> -
> /* Initialize resolver state pointer. */
> __resp = &pd->res;
>
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 37cab6f06b..346bbb812d 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -352,11 +352,6 @@ struct rtld_global
> /* The object to be initialized first. */
> EXTERN struct link_map *_dl_initfirst;
>
> -#if HP_SMALL_TIMING_AVAIL
> - /* Start time on CPU clock. */
> - EXTERN hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
> /* Map of shared object to be profiled. */
> EXTERN struct link_map *_dl_profile_map;
>
> diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
> index a58338c930..72c80a8a46 100644
> --- a/sysdeps/mach/hurd/dl-sysdep.c
> +++ b/sysdeps/mach/hurd/dl-sysdep.c
> @@ -62,10 +62,6 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
> void *__libc_stack_end = NULL;
> rtld_hidden_data_def(__libc_stack_end)
>
> -#if HP_TIMING_AVAIL
> -hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
> /* TODO: Initialize. */
> void *_dl_random attribute_relro = NULL;
>
> @@ -246,10 +242,6 @@ unfmh(); /* XXX */
> /* Initialize frequently used global variable. */
> GLRO(dl_pagesize) = __getpagesize ();
>
> -#if HP_TIMING_AVAIL
> - HP_TIMING_NOW (_dl_cpuclock_offset);
> -#endif
> -
> fmh(); /* XXX */
>
> /* See hurd/hurdstartup.c; this deals with getting information
> diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c
> index 14b69a6f89..3f357665bd 100644
> --- a/sysdeps/nptl/fork.c
> +++ b/sysdeps/nptl/fork.c
> @@ -83,14 +83,6 @@ __libc_fork (void)
> if (__fork_generation_pointer != NULL)
> *__fork_generation_pointer += __PTHREAD_ONCE_FORK_GEN_INCR;
>
> -#if HP_TIMING_AVAIL
> - /* The CPU clock of the thread and process have to be set to zero. */
> - hp_timing_t now;
> - HP_TIMING_NOW (now);
> - THREAD_SETMEM (self, cpuclock_offset, now);
> - GL(dl_cpuclock_offset) = now;
> -#endif
> -
> #ifdef __NR_set_robust_list
> /* Initialize the robust mutex list setting in the kernel which has
> been reset during the fork. We do not check for errors because if
> diff --git a/sysdeps/posix/clock_getres.c b/sysdeps/posix/clock_getres.c
> index dac4761fcc..01024a3f55 100644
> --- a/sysdeps/posix/clock_getres.c
> +++ b/sysdeps/posix/clock_getres.c
> @@ -24,37 +24,6 @@
> #include <libc-internal.h>
>
>
> -#if HP_TIMING_AVAIL
> -static long int nsec; /* Clock frequency of the processor. */
> -
> -static int
> -hp_timing_getres (struct timespec *res)
> -{
> - if (__glibc_unlikely (nsec == 0))
> - {
> - hp_timing_t freq;
> -
> - /* This can only happen if we haven't initialized the `nsec'
> - variable yet. Do this now. We don't have to protect this
> - code against multiple execution since all of them should
> - lead to the same result. */
> - freq = __get_clockfreq ();
> - if (__glibc_unlikely (freq == 0))
> - /* Something went wrong. */
> - return -1;
> -
> - nsec = MAX (UINT64_C (1000000000) / freq, 1);
> - }
> -
> - /* Fill in the values.
> - The seconds are always zero (unless we have a 1Hz machine). */
> - res->tv_sec = 0;
> - res->tv_nsec = nsec;
> -
> - return 0;
> -}
> -#endif
> -
> static inline int
> realtime_getres (struct timespec *res)
> {
> @@ -87,21 +56,8 @@ __clock_getres (clockid_t clock_id, struct timespec *res)
> break;
>
> default:
> -#if HP_TIMING_AVAIL
> - if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
> - == CLOCK_THREAD_CPUTIME_ID)
> - retval = hp_timing_getres (res);
> - else
> -#endif
> - __set_errno (EINVAL);
> - break;
> -
> -#if HP_TIMING_AVAIL
> - case CLOCK_PROCESS_CPUTIME_ID:
> - case CLOCK_THREAD_CPUTIME_ID:
> - retval = hp_timing_getres (res);
> + __set_errno (EINVAL);
> break;
> -#endif
> }
>
> return retval;
> diff --git a/sysdeps/unix/clock_gettime.c b/sysdeps/unix/clock_gettime.c
> index 33a1f3335c..10a6c96d9d 100644
> --- a/sysdeps/unix/clock_gettime.c
> +++ b/sysdeps/unix/clock_gettime.c
> @@ -24,57 +24,6 @@
> #include <ldsodefs.h>
>
>
> -#if HP_TIMING_AVAIL
> -/* Clock frequency of the processor. We make it a 64-bit variable
> - because some jokers are already playing with processors with more
> - than 4GHz. */
> -static hp_timing_t freq;
> -
> -
> -/* This function is defined in the thread library. */
> -extern int __pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq,
> - struct timespec *tp)
> - __attribute__ ((__weak__));
> -
> -static int
> -hp_timing_gettime (clockid_t clock_id, struct timespec *tp)
> -{
> - hp_timing_t tsc;
> -
> - if (__glibc_unlikely (freq == 0))
> - {
> - /* This can only happen if we haven't initialized the `freq'
> - variable yet. Do this now. We don't have to protect this
> - code against multiple execution since all of them should
> - lead to the same result. */
> - freq = __get_clockfreq ();
> - if (__glibc_unlikely (freq == 0))
> - /* Something went wrong. */
> - return -1;
> - }
> -
> - if (clock_id != CLOCK_PROCESS_CPUTIME_ID
> - && __pthread_clock_gettime != NULL)
> - return __pthread_clock_gettime (clock_id, freq, tp);
> -
> - /* Get the current counter. */
> - HP_TIMING_NOW (tsc);
> -
> - /* Compute the offset since the start time of the process. */
> - tsc -= GL(dl_cpuclock_offset);
> -
> - /* Compute the seconds. */
> - tp->tv_sec = tsc / freq;
> -
> - /* And the nanoseconds. This computation should be stable until
> - we get machines with about 16GHz frequency. */
> - tp->tv_nsec = ((tsc % freq) * UINT64_C (1000000000)) / freq;
> -
> - return 0;
> -}
> -#endif
> -
> -
> static inline int
> realtime_gettime (struct timespec *tp)
> {
> @@ -105,20 +54,8 @@ __clock_gettime (clockid_t clock_id, struct timespec *tp)
> break;
>
> default:
> -#if HP_TIMING_AVAIL
> - if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
> - == CLOCK_THREAD_CPUTIME_ID)
> - retval = hp_timing_gettime (clock_id, tp);
> - else
> -#endif
> - __set_errno (EINVAL);
> - break;
> -
> -#if HP_TIMING_AVAIL
> - case CLOCK_PROCESS_CPUTIME_ID:
> - retval = hp_timing_gettime (clock_id, tp);
> + __set_errno (EINVAL);
> break;
> -#endif
> }
>
> return retval;
> diff --git a/sysdeps/unix/clock_nanosleep.c b/sysdeps/unix/clock_nanosleep.c
> index 7722d1111c..b27608570c 100644
> --- a/sysdeps/unix/clock_nanosleep.c
> +++ b/sysdeps/unix/clock_nanosleep.c
> @@ -19,23 +19,8 @@
> #include <assert.h>
> #include <errno.h>
> #include <time.h>
> -#include <hp-timing.h>
> #include <sysdep-cancel.h>
>
> -#if HP_TIMING_AVAIL
> -# define CPUCLOCK_P(clock) \
> - ((clock) == CLOCK_PROCESS_CPUTIME_ID \
> - || ((clock) & ((1 << CLOCK_IDFIELD_SIZE) - 1)) == CLOCK_THREAD_CPUTIME_ID)
> -#else
> -# define CPUCLOCK_P(clock) 0
> -#endif
> -
> -#ifndef INVALID_CLOCK_P
> -# define INVALID_CLOCK_P(cl) \
> - ((cl) < CLOCK_REALTIME || (cl) > CLOCK_THREAD_CPUTIME_ID)
> -#endif
> -
> -
> /* This implementation assumes that these is only a `nanosleep' system
> call. So we have to remap all other activities. */
> int
> @@ -51,14 +36,7 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
> if (clock_id == CLOCK_THREAD_CPUTIME_ID)
> return EINVAL; /* POSIX specifies EINVAL for this case. */
>
> -#ifdef SYSDEP_NANOSLEEP
> - SYSDEP_NANOSLEEP;
> -#endif
> -
> - if (CPUCLOCK_P (clock_id))
> - return ENOTSUP;
> -
> - if (INVALID_CLOCK_P (clock_id))
> + if (clock_id < CLOCK_REALTIME || clock_id > CLOCK_THREAD_CPUTIME_ID)
> return EINVAL;
>
> /* If we got an absolute time, remap it. */
> @@ -71,7 +49,7 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
> assert (sizeof (sec) >= sizeof (now.tv_sec));
>
> /* Get the current time for this clock. */
> - if (__builtin_expect (__clock_gettime (clock_id, &now), 0) != 0)
> + if (__clock_gettime (clock_id, &now) != 0)
> return errno;
>
> /* Compute the difference. */
> @@ -90,12 +68,12 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
> /* Make sure we are not modifying the struct pointed to by REM. */
> rem = NULL;
> }
> - else if (__builtin_expect (flags, 0) != 0)
> + else if (flags != 0)
> return EINVAL;
> else if (clock_id != CLOCK_REALTIME)
> /* Not supported. */
> return ENOTSUP;
>
> - return __builtin_expect (__nanosleep (req, rem), 0) ? errno : 0;
> + return __nanosleep (req, rem), 0 ? errno : 0;
> }
> weak_alias (__clock_nanosleep, clock_nanosleep)
> diff --git a/sysdeps/unix/clock_settime.c b/sysdeps/unix/clock_settime.c
> index dcf9ff660a..109a1ad872 100644
> --- a/sysdeps/unix/clock_settime.c
> +++ b/sysdeps/unix/clock_settime.c
> @@ -21,59 +21,11 @@
> #include <ldsodefs.h>
>
>
> -#if HP_TIMING_AVAIL
> -/* Clock frequency of the processor. We make it a 64-bit variable
> - because some jokers are already playing with processors with more
> - than 4GHz. */
> -static hp_timing_t freq;
> -
> -
> -/* This function is defined in the thread library. */
> -extern void __pthread_clock_settime (clockid_t clock_id, hp_timing_t offset)
> - __attribute__ ((__weak__));
> -
> -
> -static int
> -hp_timing_settime (clockid_t clock_id, const struct timespec *tp)
> -{
> - hp_timing_t tsc;
> - hp_timing_t usertime;
> -
> - /* First thing is to get the current time. */
> - HP_TIMING_NOW (tsc);
> -
> - if (__glibc_unlikely (freq == 0))
> - {
> - /* This can only happen if we haven't initialized the `freq'
> - variable yet. Do this now. We don't have to protect this
> - code against multiple execution since all of them should lead
> - to the same result. */
> - freq = __get_clockfreq ();
> - if (__glibc_unlikely (freq == 0))
> - /* Something went wrong. */
> - return -1;
> - }
> -
> - /* Convert the user-provided time into CPU ticks. */
> - usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;
> -
> - /* Determine the offset and use it as the new base value. */
> - if (clock_id == CLOCK_PROCESS_CPUTIME_ID
> - || __pthread_clock_settime == NULL)
> - GL(dl_cpuclock_offset) = tsc - usertime;
> - else
> - __pthread_clock_settime (clock_id, tsc - usertime);
> -
> - return 0;
> -}
> -#endif
> -
> -
> /* Set CLOCK to value TP. */
> int
> __clock_settime (clockid_t clock_id, const struct timespec *tp)
> {
> - int retval;
> + int retval = -1;
>
> /* Make sure the time cvalue is OK. */
> if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
> @@ -93,16 +45,7 @@ __clock_settime (clockid_t clock_id, const struct timespec *tp)
> break;
>
> default:
> -# if HP_TIMING_AVAIL
> - if (CPUCLOCK_WHICH (clock_id) == CLOCK_PROCESS_CPUTIME_ID
> - || CPUCLOCK_WHICH (clock_id) == CLOCK_THREAD_CPUTIME_ID)
> - retval = hp_timing_settime (clock_id, tp);
> - else
> -# endif
> - {
> - __set_errno (EINVAL);
> - retval = -1;
> - }
> + __set_errno (EINVAL);
> break;
> }
>
>
next prev parent reply other threads:[~2019-03-19 17:24 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-18 21:11 [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 2/6] linux: Assume clock_getres CLOCK_{PROCESS,THREAD}_CPUTIME_ID Adhemerval Zanella
2019-03-19 17:24 ` Adhemerval Zanella
2019-03-20 11:49 ` Andreas Schwab
2019-03-20 14:13 ` Adhemerval Zanella
2019-03-20 14:39 ` Andreas Schwab
2019-02-18 21:11 ` [PATCH v2 3/6] Remove __get_clockfreq Adhemerval Zanella
2019-03-19 17:24 ` Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 4/6] Do not use HP_TIMING_NOW for random bits Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 5/6] Refactor hp-timing rtld usage Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 6/6] Add generic hp-timing support Adhemerval Zanella
2019-03-19 17:23 ` Adhemerval Zanella [this message]
2019-03-20 11:32 ` [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime Andreas Schwab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/libc/involved.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5a213c63-a2ef-9d43-bdd3-95608fd0db68@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).