diff options
Diffstat (limited to 'librt/clock_gettime.c')
-rw-r--r-- | librt/clock_gettime.c | 164 |
1 files changed, 8 insertions, 156 deletions
diff --git a/librt/clock_gettime.c b/librt/clock_gettime.c index d87b7e463..e65d39d44 100644 --- a/librt/clock_gettime.c +++ b/librt/clock_gettime.c @@ -16,176 +16,30 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <sysdep.h> #include <errno.h> +#include <sysdep.h> #include <time.h> +#include <sys/time.h> #include "kernel-posix-cpu-timers.h" -#include <bits/kernel-features.h> #define SYSCALL_GETTIME \ retval = INLINE_SYSCALL (clock_gettime, 2, clock_id, tp); \ break -#ifdef __ASSUME_POSIX_TIMERS - -/* This means the REALTIME and MONOTONIC clock are definitely - supported in the kernel. */ -# define SYSDEP_GETTIME \ +/* The REALTIME and MONOTONIC clock are definitely supported in the kernel. */ +#define SYSDEP_GETTIME \ SYSDEP_GETTIME_CPUTIME \ case CLOCK_REALTIME: \ case CLOCK_MONOTONIC: \ SYSCALL_GETTIME -# define __libc_missing_posix_timers 0 -#elif defined __NR_clock_gettime -/* Is the syscall known to exist? */ -int __libc_missing_posix_timers attribute_hidden; - -static inline int -maybe_syscall_gettime (clockid_t clock_id, struct timespec *tp) -{ - int e = EINVAL; - - if (!__libc_missing_posix_timers) - { - INTERNAL_SYSCALL_DECL (err); - int r = INTERNAL_SYSCALL (clock_gettime, err, 2, clock_id, tp); - if (!INTERNAL_SYSCALL_ERROR_P (r, err)) - return 0; - - e = INTERNAL_SYSCALL_ERRNO (r, err); - if (e == ENOSYS) - { - __libc_missing_posix_timers = 1; - e = EINVAL; - } - } - - return e; -} - -/* The REALTIME and MONOTONIC clock might be available. Try the - syscall first. */ -# define SYSDEP_GETTIME \ - SYSDEP_GETTIME_CPUTIME \ - case CLOCK_REALTIME: \ - case CLOCK_MONOTONIC: \ - retval = maybe_syscall_gettime (clock_id, tp); \ - if (retval == 0) \ - break; \ - /* Fallback code. */ \ - if (retval == EINVAL && clock_id == CLOCK_REALTIME) \ - retval = realtime_gettime (tp); \ - else \ - { \ - __set_errno (retval); \ - retval = -1; \ - } \ - break; -#endif - -#ifdef __NR_clock_gettime /* We handled the REALTIME clock here. */ -# define HANDLED_REALTIME 1 -# define HANDLED_CPUTIME 1 - -# if __ASSUME_POSIX_CPU_TIMERS > 0 - -# define SYSDEP_GETTIME_CPU SYSCALL_GETTIME -# define SYSDEP_GETTIME_CPUTIME /* Default catches them too. */ - -# else +#define HANDLED_REALTIME 1 +#define HANDLED_CPUTIME 1 -int __libc_missing_posix_cpu_timers attribute_hidden; - -static int -maybe_syscall_gettime_cpu (clockid_t clock_id, struct timespec *tp) -{ - int e = EINVAL; - - if (!__libc_missing_posix_cpu_timers) - { - INTERNAL_SYSCALL_DECL (err); - int r = INTERNAL_SYSCALL (clock_gettime, err, 2, clock_id, tp); - if (!INTERNAL_SYSCALL_ERROR_P (r, err)) - return 0; - - e = INTERNAL_SYSCALL_ERRNO (r, err); -# ifndef __ASSUME_POSIX_TIMERS - if (e == ENOSYS) - { - __libc_missing_posix_timers = 1; - __libc_missing_posix_cpu_timers = 1; - e = EINVAL; - } - else -# endif - { - if (e == EINVAL) - { - /* Check whether the kernel supports CPU clocks at all. - If not, record it for the future. */ - r = INTERNAL_SYSCALL (clock_getres, err, 2, - MAKE_PROCESS_CPUCLOCK (0, CPUCLOCK_SCHED), - NULL); - if (INTERNAL_SYSCALL_ERROR_P (r, err)) - __libc_missing_posix_cpu_timers = 1; - } - } - } - - return e; -} - -# define SYSDEP_GETTIME_CPU \ - retval = maybe_syscall_gettime_cpu (clock_id, tp); \ - if (retval == 0) \ - break; \ - if (retval != EINVAL || !__libc_missing_posix_cpu_timers) \ - { \ - __set_errno (retval); \ - retval = -1; \ - break; \ - } \ - retval = -1 /* Otherwise continue on to the HP_TIMING version. */; - -static inline int -maybe_syscall_gettime_cputime (clockid_t clock_id, struct timespec *tp) -{ - return maybe_syscall_gettime_cpu - (clock_id == CLOCK_THREAD_CPUTIME_ID - ? MAKE_THREAD_CPUCLOCK (0, CPUCLOCK_SCHED) - : MAKE_PROCESS_CPUCLOCK (0, CPUCLOCK_SCHED), - tp); -} - -# define SYSDEP_GETTIME_CPUTIME \ - case CLOCK_PROCESS_CPUTIME_ID: \ - case CLOCK_THREAD_CPUTIME_ID: \ - retval = maybe_syscall_gettime_cputime (clock_id, tp); \ - if (retval == 0) \ - break; \ - if (retval != EINVAL || !__libc_missing_posix_cpu_timers) \ - { \ - __set_errno (retval); \ - retval = -1; \ - break; \ - } \ - retval = hp_timing_gettime (clock_id, tp); \ - break; -# if !HP_TIMING_AVAIL -# define hp_timing_gettime(clock_id, tp) (__set_errno (EINVAL), -1) -# endif - -# endif -#endif - -#include <errno.h> -#include <stdint.h> -#include <time.h> -#include <sys/time.h> -#include <ldsodefs.h> +#define SYSDEP_GETTIME_CPU SYSCALL_GETTIME +#define SYSDEP_GETTIME_CPUTIME /* Default catches them too. */ static inline int realtime_gettime (struct timespec *tp) @@ -198,7 +52,6 @@ realtime_gettime (struct timespec *tp) return retval; } -librt_hidden_proto (clock_gettime) /* Get current value of CLOCK and store it in TP. */ int clock_gettime (clockid_t clock_id, struct timespec *tp) @@ -232,4 +85,3 @@ clock_gettime (clockid_t clock_id, struct timespec *tp) return retval; } -librt_hidden_def (clock_gettime) |