[PATCH] y2038: Redirect to 64 bit time functions when __USE_TIME_BITS64 is defined

Lukasz Majewski lukma@denx.de
Tue Dec 29 10:27:01 GMT 2020


Dear Community,

I do know that the "freeze" time for glibc release is coming, but I
would be very happy to receive feedback on this patch.

It is the attempt to divide the Y2038 support to smaller chunks, so it
would be easier to review.

> Exported headers have been modified to provide redirections to 64 bit
> functions when __USE_TIME_BITS64 is defined - this exported flag is
> set only when _TIME_BITS=64 and _FILE_OFFSET_BITS=64 are set on
> compilation time.
> For example, when __USE_TIME_BIT64 is defined - calls to clock_settime
> are redirected to clock_settime64, which supports setting 64 bit time
> in glibc ports with __WORDSIZE==32 and __TIMESIZE != 64.
> 
> This patch is the preparatory one for addressing Y2038 issue and as
> such will be inactive until support for _TIME_BITS exported flag is
> added, which in turn causes definition of __USE_TIME_BITS64.

To emphasize - this patch set will not introduce any harm, as
__USE_TIME_BITS64 will be NOT defined until the support for 64 bit time
is added to glibc.

> ---
>  io/sys/poll.h                         |  11 ++
>  io/sys/stat.h                         |  20 ++++
>  io/utime.h                            |  10 ++
>  misc/sys/select.h                     |  27 +++++
>  posix/sched.h                         |   9 ++
>  posix/sys/wait.h                      |  20 ++++
>  resolv/netdb.h                        |  11 ++
>  resource/sys/resource.h               |  10 ++
>  rt/aio.h                              |  25 ++++-
>  rt/mqueue.h                           |  25 +++++
>  signal/signal.h                       |  12 +++
>  socket/sys/socket.h                   |  11 ++
>  sysdeps/nptl/pthread.h                | 117 +++++++++++++++++++++
>  sysdeps/pthread/semaphore.h           |  23 ++++
>  sysdeps/pthread/threads.h             |  33 ++++++
>  sysdeps/unix/sysv/linux/bits/time.h   |  10 ++
>  sysdeps/unix/sysv/linux/sys/timerfd.h |  22 ++++
>  sysdeps/unix/sysv/linux/sys/timex.h   |  37 ++++++-
>  sysvipc/sys/msg.h                     |  10 ++
>  sysvipc/sys/sem.h                     |  21 ++++
>  sysvipc/sys/shm.h                     |  10 ++
>  time/sys/time.h                       |  91 ++++++++++++++++
>  time/time.h                           | 146
> ++++++++++++++++++++++++++ 23 files changed, 705 insertions(+), 6
> deletions(-)
> 
> diff --git a/io/sys/poll.h b/io/sys/poll.h
> index 857be0f5ac..4a725ed18e 100644
> --- a/io/sys/poll.h
> +++ b/io/sys/poll.h
> @@ -63,6 +63,17 @@ extern int poll (struct pollfd *__fds, nfds_t
> __nfds, int __timeout); extern int ppoll (struct pollfd *__fds,
> nfds_t __nfds, const struct timespec *__timeout,
>  		  const __sigset_t *__ss);
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (ppoll, (struct pollfd *__fds, nfds_t __nfds,
> +                               const struct timespec *__timeout,
> +                               const __sigset_t *__ss),
> +                       __ppoll64);
> +#  else
> +#  define ppoll __ppoll64
> +#  endif
> +# endif
>  #endif
>  
>  __END_DECLS
> diff --git a/io/sys/stat.h b/io/sys/stat.h
> index 58c3770622..b3f2f0da99 100644
> --- a/io/sys/stat.h
> +++ b/io/sys/stat.h
> @@ -361,11 +361,31 @@ extern int utimensat (int __fd, const char
> *__path, const struct timespec __times[2],
>  		      int __flags)
>       __THROW __nonnull ((2));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (utimensat, (int fd, const char *__path,
> +                                       const struct timespec
> __times[2],
> +                                       int flags),
> +                           __utimensat64) __nonnull ((2));
> +#  else
> +#  define utimensat __utimensat64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_XOPEN2K8
>  /* Set file access and modification times of the file associated
> with FD.  */ extern int futimens (int __fd, const struct timespec
> __times[2]) __THROW; +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (futimens, (int fd, const struct timespec
> __times[2]),
> +                           __futimens64);
> +#  else
> +#  define futimens __futimens64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_GNU
> diff --git a/io/utime.h b/io/utime.h
> index 07659016ab..f607bf0aad 100644
> --- a/io/utime.h
> +++ b/io/utime.h
> @@ -45,6 +45,16 @@ extern int utime (const char *__file,
>  		  const struct utimbuf *__file_times)
>       __THROW __nonnull ((1));
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (utime, (const char *__file,
> +                                   const struct utimbuf
> *__file_times),
> +                           __utime64);
> +# else
> +# define utime __utime64
> +# endif
> +#endif
> +
>  __END_DECLS
>  
>  #endif /* utime.h */
> diff --git a/misc/sys/select.h b/misc/sys/select.h
> index 29d011c2d5..779a6e81b6 100644
> --- a/misc/sys/select.h
> +++ b/misc/sys/select.h
> @@ -103,6 +103,19 @@ extern int select (int __nfds, fd_set
> *__restrict __readfds, fd_set *__restrict __exceptfds,
>  		   struct timeval *__restrict __timeout);
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT)
> +extern int __REDIRECT (select,
> +                       (int __nfds, fd_set *__restrict __readfds,
> +                        fd_set *__restrict __writefds,
> +                        fd_set *__restrict __exceptfds,
> +                        struct timeval *__restrict __timeout),
> +                       __select64);
> +# else
> +#  define select __select64
> +# endif
> +#endif
> +
>  #ifdef __USE_XOPEN2K
>  /* Same as above only that the TIMEOUT value is given with higher
>     resolution and a sigmask which is been set temporarily.  This
> version @@ -115,6 +128,20 @@ extern int pselect (int __nfds, fd_set
> *__restrict __readfds, fd_set *__restrict __exceptfds,
>  		    const struct timespec *__restrict __timeout,
>  		    const __sigset_t *__restrict __sigmask);
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (pselect,
> +                       (int __nfds, fd_set *__restrict __readfds,
> +                        fd_set *__restrict __writefds,
> +                        fd_set *__restrict __exceptfds,
> +                        const struct timespec *__restrict __timeout,
> +                        const __sigset_t *__restrict __sigmask),
> +                       __pselect64);
> +#  else
> +#   define pselect __pselect64
> +#  endif
> +# endif
>  #endif
>  
>  
> diff --git a/posix/sched.h b/posix/sched.h
> index 60c9c3c710..0d9cbc5bb2 100644
> --- a/posix/sched.h
> +++ b/posix/sched.h
> @@ -76,6 +76,15 @@ extern int sched_get_priority_min (int
> __algorithm) __THROW; /* Get the SCHED_RR interval for the named
> process.  */ extern int sched_rr_get_interval (__pid_t __pid, struct
> timespec *__t) __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (sched_rr_get_interval,
> +                           (__pid_t __pid, struct timespec *__t),
> +                           __sched_rr_get_interval64);
> +# else
> +# define sched_rr_get_interval __sched_rr_get_interval64
> +# endif
> +#endif
>  
>  #ifdef __USE_GNU
>  /* Access macros for `cpu_set'.  */
> diff --git a/posix/sys/wait.h b/posix/sys/wait.h
> index a42e16c1b0..68ec036b29 100644
> --- a/posix/sys/wait.h
> +++ b/posix/sys/wait.h
> @@ -146,12 +146,32 @@ struct rusage;
>     otherwise don't.  */
>  extern __pid_t wait3 (int *__stat_loc, int __options,
>  		      struct rusage * __usage) __THROWNL;
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTHNL)
> +extern __pid_t __REDIRECT_NTHNL (wait3, (int *__stat_loc, int
> __options,
> +                                         struct rusage * __usage)
> +                                 __wait3_time64);
> +#  else
> +#  define wait3 __wait3_time64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_MISC
>  /* PID is like waitpid.  Other args are like wait3.  */
>  extern __pid_t wait4 (__pid_t __pid, int *__stat_loc, int __options,
>  		      struct rusage *__usage) __THROWNL;
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTHNL)
> +extern __pid_t __REDIRECT_NTHNL (wait4, (__pid_t __pid, int
> *__stat_loc,
> +                                         int __options, struct
> rusage *__usage),
> +                                 __wait4_time64);
> +#  else
> +#  define wait4 __wait4_time64
> +#  endif
> +# endif
>  #endif /* Use misc.  */
>  
>  
> diff --git a/resolv/netdb.h b/resolv/netdb.h
> index 575e416dac..bd0832988f 100644
> --- a/resolv/netdb.h
> +++ b/resolv/netdb.h
> @@ -701,6 +701,17 @@ extern int getaddrinfo_a (int __mode, struct
> gaicb *__list[__restrict_arr], extern int gai_suspend (const struct
> gaicb *const __list[], int __ent, const struct timespec *__timeout);
>  
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (gai_suspend, (const struct gaicb *const
> __list[],
> +                                     int __ent,
> +                                     const struct timespec
> *__timeout),
> +                       __gai_suspend_time64);
> +#  else
> +#   define gai_suspend __gai_suspend_time64
> +#  endif
> +# endif
> +
>  /* Get the error status of the request REQ.  */
>  extern int gai_error (struct gaicb *__req) __THROW;
>  
> diff --git a/resource/sys/resource.h b/resource/sys/resource.h
> index 4edafb50d5..98f05cf1c4 100644
> --- a/resource/sys/resource.h
> +++ b/resource/sys/resource.h
> @@ -86,6 +86,16 @@ extern int setrlimit64 (__rlimit_resource_t
> __resource, and put it in *USAGE.  Returns 0 for success, -1 for
> failure.  */ extern int getrusage (__rusage_who_t __who, struct
> rusage *__usage) __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (getrusage, (__rusage_who_t __who,
> +                                       struct rusage *__usage),
> +                           __getrusage64);
> +# else
> +# define getrusage __getrusage64
> +# endif
> +#endif
> +
>  /* Return the highest priority of any process specified by WHICH and
> WHO (see above); if WHO is zero, the current process, process group,
> or user (as specified by WHO) is used.  A lower priority number means
> higher diff --git a/rt/aio.h b/rt/aio.h
> index 148d31a0af..2c35f1b04c 100644
> --- a/rt/aio.h
> +++ b/rt/aio.h
> @@ -193,12 +193,17 @@ extern __ssize_t __REDIRECT_NTH (aio_return,
> (struct aiocb *__aiocbp), extern int __REDIRECT_NTH (aio_cancel,
>  			   (int __fildes, struct aiocb *__aiocbp),
>  			   aio_cancel64);
> -
> +#  ifdef __USE_TIME_BITS64
> +extern int __REDIRECT_NTH (aio_suspend,
> +			   (const struct aiocb *const __list[], int
> __nent,
> +			    const struct timespec *__restrict
> __timeout),
> +			   __aio_suspend_time64) __nonnull ((1));
> +#  else
>  extern int __REDIRECT_NTH (aio_suspend,
>  			   (const struct aiocb *const __list[], int
> __nent, const struct timespec *__restrict __timeout),
>  			   aio_suspend64) __nonnull ((1));
> -
> +#  endif
>  extern int __REDIRECT_NTH (aio_fsync,
>  			   (int __operation, struct aiocb *__aiocbp),
>  			   aio_fsync64) __nonnull ((2));
> @@ -210,7 +215,11 @@ extern int __REDIRECT_NTH (aio_fsync,
>  #  define aio_error aio_error64
>  #  define aio_return aio_return64
>  #  define aio_cancel aio_cancel64
> -#  define aio_suspend aio_suspend64
> +#  ifdef __USE_TIME_BITS64
> +#   define aio_suspend __aio_suspend_time64
> +#  else
> +#   define aio_suspend aio_suspend64
> +#  endif
>  #  define aio_fsync aio_fsync64
>  # endif
>  #endif
> @@ -234,6 +243,16 @@ extern int aio_cancel64 (int __fildes, struct
> aiocb64 *__aiocbp) __THROW; extern int aio_suspend64 (const struct
> aiocb64 *const __list[], int __nent, const struct timespec
> *__restrict __timeout) __THROW __nonnull ((1));
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (aio_suspend64,
> +			   (const struct aiocb *const __list[], int
> __nent,
> +			    const struct timespec *__restrict
> __timeout),
> +			   __aio_suspend_time64) __nonnull ((1));
> +#  else
> +#   define aio_suspend64 __aio_suspend_time64
> +#  endif
> +# endif
>  
>  extern int aio_fsync64 (int __operation, struct aiocb64 *__aiocbp)
>    __THROW __nonnull ((2));
> diff --git a/rt/mqueue.h b/rt/mqueue.h
> index a2a2aa1771..e6b8641c62 100644
> --- a/rt/mqueue.h
> +++ b/rt/mqueue.h
> @@ -79,12 +79,37 @@ extern ssize_t mq_timedreceive (mqd_t __mqdes,
> char *__restrict __msg_ptr, const struct timespec *__restrict
> __abs_timeout) __nonnull ((2, 5));
>  
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (mq_timedreceive, (mqd_t __mqdes,
> +                               char *__restrict __msg_ptr,
> +                               size_t __msg_len,
> +                               unsigned int *__restrict __msg_prio,
> +                               const struct timespec *__restrict
> __abs_timeout),
> +                       __mq_timedreceive_time64);
> +#  else
> +#   define mq_timedreceive __mq_timedreceive_time64
> +#  endif
> +# endif
> +
>  /* Add message pointed by MSG_PTR to message queue MQDES, stop
> blocking on full message queue if ABS_TIMEOUT expires.  */
>  extern int mq_timedsend (mqd_t __mqdes, const char *__msg_ptr,
>  			 size_t __msg_len, unsigned int __msg_prio,
>  			 const struct timespec *__abs_timeout)
>    __nonnull ((2, 5));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (mq_timedsend, (mqd_t __mqdes,
> +                       const char *__msg_ptr, size_t __msg_len,
> +                       unsigned int __msg_prio,
> +                       const struct timespec *__abs_timeout),
> +     __mq_timedsend_time64);
> +#  else
> +#   define mq_timedsend __mq_timedsend_time64
> +#  endif
> +# endif
>  #endif
>  
>  /* Define some inlines helping to catch common problems.  */
> diff --git a/signal/signal.h b/signal/signal.h
> index effe3d698f..564820e366 100644
> --- a/signal/signal.h
> +++ b/signal/signal.h
> @@ -274,6 +274,18 @@ extern int sigtimedwait (const sigset_t
> *__restrict __set, const struct timespec *__restrict __timeout)
>       __nonnull ((1));
>  
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT)
> +extern int __REDIRECT (sigtimedwait,
> +                       (const sigset_t *__restrict __set,
> +                        siginfo_t *__restrict __info,
> +                        const struct timespec *__restrict __timeout),
> +                       __sigtimedwait64);
> +#   else
> +#    define sigtimedwait __sigtimedwait64
> +#   endif
> +#  endif
> +
>  /* Send signal SIG to the process PID.  Associate data in VAL with
> the signal.  */
>  extern int sigqueue (__pid_t __pid, int __sig, const union sigval
> __val) diff --git a/socket/sys/socket.h b/socket/sys/socket.h
> index 7780c00ecb..2273c52cdf 100644
> --- a/socket/sys/socket.h
> +++ b/socket/sys/socket.h
> @@ -199,6 +199,17 @@ extern ssize_t recvmsg (int __fd, struct msghdr
> *__message, int __flags); extern int recvmmsg (int __fd, struct
> mmsghdr *__vmessages, unsigned int __vlen, int __flags,
>  		     struct timespec *__tmo);
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (recvmmsg, (int __fd, struct mmsghdr
> *__vmessages,
> +                                  unsigned int __vlen, int __flags,
> +                                  struct timespec *__tmo),
> +                       __recvmmsg64);
> +#  else
> +#   define recvmmsg __recvmmsg64
> +#  endif
> +# endif
>  #endif
>  
>  
> diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
> index 3a34d82342..982ed32baa 100644
> --- a/sysdeps/nptl/pthread.h
> +++ b/sysdeps/nptl/pthread.h
> @@ -230,6 +230,17 @@ extern int pthread_tryjoin_np (pthread_t __th,
> void **__thread_return) __THROW; extern int pthread_timedjoin_np
> (pthread_t __th, void **__thread_return, const struct timespec
> *__abstime); 
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (pthread_timedjoin_np,
> +                       (pthread_t __th, void **__thread_return,
> +                        const struct timespec *__abstime),
> +                       __pthread_timedjoin_np64);
> +#  else
> +#  define pthread_timedjoin_np __pthread_timedjoin_np64
> +#  endif
> +# endif
> +
>  /* Make calling thread wait for termination of the thread TH, but
> only until TIMEOUT measured against the clock specified by CLOCKID.
> The exit status of the thread is stored in *THREAD_RETURN, if
> @@ -240,6 +251,18 @@ extern int pthread_timedjoin_np (pthread_t __th,
> void **__thread_return, extern int pthread_clockjoin_np (pthread_t
> __th, void **__thread_return, clockid_t __clockid,
>  				 const struct timespec *__abstime);
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (pthread_clockjoin_np,
> +                       (pthread_t __th, void **__thread_return,
> +                        clockid_t __clockid,
> +                        const struct timespec *__abstime),
> +                       __pthread_clockjoin_np64);
> +#  else
> +#  define pthread_clockjoin_np __pthread_clockjoin_np64
> +#  endif
> +# endif
>  #endif
>  
>  /* Indicate that the thread TH is never to be joined with
> PTHREAD_JOIN. @@ -776,6 +799,17 @@ extern int pthread_mutex_lock
> (pthread_mutex_t *__mutex) extern int pthread_mutex_timedlock
> (pthread_mutex_t *__restrict __mutex, const struct timespec
> *__restrict __abstime) __THROWNL __nonnull ((1, 2));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_mutex_timedlock,
> +                             (pthread_mutex_t *__restrict __mutex,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_mutex_timedlock64);
> +#  else
> +#   define pthread_mutex_timedlock __pthread_mutex_timedlock64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_GNU
> @@ -783,6 +817,18 @@ extern int pthread_mutex_clocklock
> (pthread_mutex_t *__restrict __mutex, clockid_t __clockid,
>  				    const struct timespec *__restrict
>  				    __abstime) __THROWNL __nonnull
> ((1, 3)); +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_mutex_clocklock,
> +                             (pthread_mutex_t *__restrict __mutex,
> +                              clockid_t __clockid,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_mutex_clocklock64);
> +#  else
> +#   define pthread_mutex_clocklock __pthread_mutex_clocklock64
> +#  endif
> +# endif
>  #endif
>  
>  /* Unlock a mutex.  */
> @@ -922,6 +968,17 @@ extern int pthread_rwlock_tryrdlock
> (pthread_rwlock_t *__rwlock) extern int pthread_rwlock_timedrdlock
> (pthread_rwlock_t *__restrict __rwlock, const struct timespec
> *__restrict __abstime) __THROWNL __nonnull ((1, 2));
> +
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_rwlock_timedrdlock,
> +                             (pthread_rwlock_t *__restrict __rwlock,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_rwlock_timedrdlock64);
> +#   else
> +#    define pthread_rwlock_timedrdlock __pthread_rwlock_timedrdlock64
> +#   endif
> +#  endif
>  # endif
>  
>  # ifdef __USE_GNU
> @@ -929,6 +986,18 @@ extern int pthread_rwlock_clockrdlock
> (pthread_rwlock_t *__restrict __rwlock, clockid_t __clockid,
>  				       const struct timespec
> *__restrict __abstime) __THROWNL __nonnull ((1, 3));
> +
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_rwlock_clockrdlock,
> +                             (pthread_rwlock_t *__restrict __rwlock,
> +                              clockid_t __clockid,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_rwlock_clockrdlock64);
> +#   else
> +#    define pthread_rwlock_clockrdlock __pthread_rwlock_clockrdlock64
> +#   endif
> +#  endif
>  # endif
>  
>  /* Acquire write lock for RWLOCK.  */
> @@ -944,6 +1013,17 @@ extern int pthread_rwlock_trywrlock
> (pthread_rwlock_t *__rwlock) extern int pthread_rwlock_timedwrlock
> (pthread_rwlock_t *__restrict __rwlock, const struct timespec
> *__restrict __abstime) __THROWNL __nonnull ((1, 2));
> +
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_rwlock_timedwrlock,
> +                             (pthread_rwlock_t *__restrict __rwlock,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_rwlock_timedwrlock64);
> +#   else
> +#    define pthread_rwlock_timedwrlock __pthread_rwlock_timedwrlock64
> +#   endif
> +#  endif
>  # endif
>  
>  # ifdef __USE_GNU
> @@ -951,6 +1031,18 @@ extern int pthread_rwlock_clockwrlock
> (pthread_rwlock_t *__restrict __rwlock, clockid_t __clockid,
>  				       const struct timespec
> *__restrict __abstime) __THROWNL __nonnull ((1, 3));
> +
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT_NTHNL)
> +extern int __REDIRECT_NTHNL (pthread_rwlock_clockwrlock,
> +                             (pthread_rwlock_t *__restrict __rwlock,
> +                              clockid_t __clockid,
> +                              const struct timespec *__restrict
> __abstime),
> +                             __pthread_rwlock_clockwrlock64);
> +#   else
> +#    define pthread_rwlock_clockwrlock __pthread_rwlock_clockwrlock64
> +#   endif
> +#  endif
>  # endif
>  
>  /* Unlock RWLOCK.  */
> @@ -1032,6 +1124,18 @@ extern int pthread_cond_timedwait
> (pthread_cond_t *__restrict __cond, const struct timespec *__restrict
> __abstime) __nonnull ((1, 2, 3));
>  
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (pthread_cond_timedwait,
> +                       (pthread_cond_t *__restrict __cond,
> +                        pthread_mutex_t *__restrict __mutex,
> +                        const struct timespec *__restrict __abstime),
> +                       __pthread_cond_timedwait64);
> +#  else
> +#  define pthread_cond_timedwait __pthread_cond_timedwait64
> +#  endif
> +# endif
> +
>  # ifdef __USE_GNU
>  /* Wait for condition variable COND to be signaled or broadcast until
>     ABSTIME measured by the specified clock. MUTEX is assumed to be
> @@ -1045,6 +1149,19 @@ extern int pthread_cond_clockwait
> (pthread_cond_t *__restrict __cond, __clockid_t __clock_id,
>  				   const struct timespec *__restrict
> __abstime) __nonnull ((1, 2, 4));
> +
> +#  ifdef __USE_TIME_BITS64
> +#   if defined(__REDIRECT)
> +extern int __REDIRECT (pthread_cond_clockwait,
> +                       (pthread_cond_t *__restrict __cond,
> +                        pthread_mutex_t *__restrict __mutex,
> +                        __clockid_t __clock_id,
> +                        const struct timespec *__restrict __abstime),
> +                       __pthread_cond_clockwait64);
> +#   else
> +#   define pthread_cond_clockwait __pthread_cond_clockwait64
> +#   endif
> +#  endif
>  # endif
>  
>  /* Functions for handling condition variable attributes.  */
> diff --git a/sysdeps/pthread/semaphore.h b/sysdeps/pthread/semaphore.h
> index 436d21cb08..6a6055fc3a 100644
> --- a/sysdeps/pthread/semaphore.h
> +++ b/sysdeps/pthread/semaphore.h
> @@ -62,6 +62,17 @@ extern int sem_wait (sem_t *__sem) __nonnull ((1));
>  extern int sem_timedwait (sem_t *__restrict __sem,
>  			  const struct timespec *__restrict
> __abstime) __nonnull ((1, 2));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (sem_timedwait,
> +                       (sem_t *__restrict __sem,
> +                        const struct timespec *__restrict __abstime),
> +                        __sem_timedwait64);
> +#  else
> +#   define sem_timedwait __sem_timedwait64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_GNU
> @@ -69,6 +80,18 @@ extern int sem_clockwait (sem_t *__restrict __sem,
>  			  clockid_t clock,
>  			  const struct timespec *__restrict
> __abstime) __nonnull ((1, 3));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (sem_clockwait,
> +                       (sem_t *__restrict __sem,
> +                        clockid_t clock,
> +                        const struct timespec *__restrict __abstime),
> +                        __sem_clockwait64);
> +#  else
> +#   define sem_clockwait __sem_clockwait64
> +#  endif
> +# endif
>  #endif
>  
>  /* Test whether SEM is posted.  */
> diff --git a/sysdeps/pthread/threads.h b/sysdeps/pthread/threads.h
> index 0ac489b4a1..acdc7b329a 100644
> --- a/sysdeps/pthread/threads.h
> +++ b/sysdeps/pthread/threads.h
> @@ -91,6 +91,16 @@ extern thrd_t thrd_current (void);
>  extern int thrd_sleep (const struct timespec *__time_point,
>  		       struct timespec *__remaining);
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT)
> +extern int __REDIRECT (thrd_sleep, (const struct timespec
> *__time_point,
> +                                    struct timespec *__remaining),
> +                       __thrd_sleep64);
> +# else
> +#  define thrd_sleep __thrd_sleep64
> +# endif
> +#endif
> +
>  /* Terminate current thread execution, cleaning up any thread local
>     storage and freeing resources.  Returns the value specified in
> __RES.  */ extern void thrd_exit (int __res) __attribute__
> ((__noreturn__)); @@ -134,6 +144,17 @@ extern int mtx_lock (mtx_t
> *__mutex); extern int mtx_timedlock (mtx_t *__restrict __mutex,
>  			  const struct timespec *__restrict
> __time_point); 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT)
> +extern int __REDIRECT (mtx_timedlock, (mtx_t *__restrict __mutex,
> +                                       const struct timespec
> *__restrict
> +                                       __time_point),
> +                       __mtx_timedlock64);
> +# else
> +#  define mtx_timedlock __mtx_timedlock64
> +# endif
> +#endif
> +
>  /* Try to lock the mutex pointed by __MUTEX without blocking.  If
> the mutex is free the current threads takes control of it, otherwise
> it returns immediately.  */
> @@ -175,6 +196,18 @@ extern int cnd_timedwait (cnd_t *__restrict
> __cond, mtx_t *__restrict __mutex,
>  			  const struct timespec *__restrict
> __time_point); 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT)
> +extern int __REDIRECT (cnd_timedwait, (cnd_t *__restrict __cond,
> +                                       mtx_t *__restrict __mutex,
> +                                       const struct timespec
> *__restrict
> +                                       __time_point),
> +                       __cnd_timedwait64);
> +# else
> +#  define cnd_timedwait __cnd_timedwait64
> +# endif
> +#endif
> +
>  /* Destroy condition variable pointed by __cond and free all of its
>     resources.  */
>  extern void cnd_destroy (cnd_t *__COND);
> diff --git a/sysdeps/unix/sysv/linux/bits/time.h
> b/sysdeps/unix/sysv/linux/bits/time.h index e0962744e1..7168ef1948
> 100644 --- a/sysdeps/unix/sysv/linux/bits/time.h
> +++ b/sysdeps/unix/sysv/linux/bits/time.h
> @@ -77,6 +77,16 @@ __BEGIN_DECLS
>  /* Tune a POSIX clock.  */
>  extern int clock_adjtime (__clockid_t __clock_id, struct timex
> *__utx) __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (clock_adjtime, (__clockid_t __clock_id,
> +                                           struct timex *__utx),
> +                           __clock_adjtime64);
> +# else
> +# define clock_adjtime __clock_adjtime64
> +# endif
> +#endif
> +
>  __END_DECLS
>  #endif /* use GNU */
>  
> diff --git a/sysdeps/unix/sysv/linux/sys/timerfd.h
> b/sysdeps/unix/sysv/linux/sys/timerfd.h index 0ae60b65bd..cd252476a7
> 100644 --- a/sysdeps/unix/sysv/linux/sys/timerfd.h
> +++ b/sysdeps/unix/sysv/linux/sys/timerfd.h
> @@ -47,9 +47,31 @@ extern int timerfd_settime (int __ufd, int __flags,
>  			    const struct itimerspec *__utmr,
>  			    struct itimerspec *__otmr) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (timerfd_settime,
> +                           (int __ufd, int __flags,
> +                            const struct itimerspec *__restrict
> __value,
> +                            struct itimerspec *__restrict __ovalue),
> +                           __timerfd_settime64);
> +# else
> +# define timerfd_settime __timerfd_settime64
> +# endif
> +#endif
> +
>  /* Return the next expiration time of UFD.  */
>  extern int timerfd_gettime (int __ufd, struct itimerspec *__otmr)
> __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (timerfd_gettime, (int __ufd,
> +                                             struct itimerspec
> *__otmr),
> +                           __timerfd_gettime64);
> +# else
> +# define timerfd_gettime __timerfd_gettime64
> +# endif
> +#endif
> +
>  __END_DECLS
>  
>  #endif /* sys/timerfd.h */
> diff --git a/sysdeps/unix/sysv/linux/sys/timex.h
> b/sysdeps/unix/sysv/linux/sys/timex.h index 6979b86b72..b5271152bb
> 100644 --- a/sysdeps/unix/sysv/linux/sys/timex.h
> +++ b/sysdeps/unix/sysv/linux/sys/timex.h
> @@ -57,15 +57,46 @@ __BEGIN_DECLS
>  extern int __adjtimex (struct timex *__ntx) __THROW;
>  extern int adjtimex (struct timex *__ntx) __THROW;
>  
> -#ifdef __REDIRECT_NTH
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (adjtimex, (struct timex *__ntx),
> +                           ___adjtimex64);
> +# else
> +# define adjtimex ___adjtimex64
> +# endif
> +#endif
> +
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
>  extern int __REDIRECT_NTH (ntp_gettime, (struct ntptimeval *__ntv),
> -			   ntp_gettimex);
> +                           __ntp_gettime64);
> +extern int __REDIRECT_NTH (ntp_gettimex, (struct ntptimeval *__ntv),
> +                           __ntp_gettimex64);
> +# else
> +# define ntp_gettime __ntp_gettime64
> +# define ntp_gettimex __ntp_gettimex64
> +# endif
>  #else
> +# ifdef __REDIRECT_NTH
> +extern int __REDIRECT_NTH (ntp_gettime, (struct ntptimeval *__ntv),
> +			   ntp_gettimex);
> +# else
>  extern int ntp_gettimex (struct ntptimeval *__ntv) __THROW;
> -# define ntp_gettime ntp_gettimex
> +#  define ntp_gettime ntp_gettimex
> +# endif
>  #endif
> +
>  extern int ntp_adjtime (struct timex *__tntx) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (ntp_adjtime, (struct timex *__ntx),
> +                           ___adjtimex64);
> +# else
> +# define ntp_adjtime ___adjtimex64
> +# endif
> +#endif
> +
>  __END_DECLS
>  
>  #endif /* sys/timex.h */
> diff --git a/sysvipc/sys/msg.h b/sysvipc/sys/msg.h
> index c70cfa582c..f39c153b86 100644
> --- a/sysvipc/sys/msg.h
> +++ b/sysvipc/sys/msg.h
> @@ -60,6 +60,16 @@ __BEGIN_DECLS
>  /* Message queue control operation.  */
>  extern int msgctl (int __msqid, int __cmd, struct msqid_ds *__buf)
> __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (msgctl,
> +                           (int __msqid, int __cmd, struct msqid_ds
> *__buf),
> +                           __msgctl64);
> +# else
> +# define msgctl __msgctl64
> +# endif
> +#endif
> +
>  /* Get messages queue.  */
>  extern int msgget (key_t __key, int __msgflg) __THROW;
>  
> diff --git a/sysvipc/sys/sem.h b/sysvipc/sys/sem.h
> index 4ede2dd6ef..b26c17914c 100644
> --- a/sysvipc/sys/sem.h
> +++ b/sysvipc/sys/sem.h
> @@ -50,6 +50,16 @@ __BEGIN_DECLS
>  /* Semaphore control operation.  */
>  extern int semctl (int __semid, int __semnum, int __cmd, ...)
> __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (semctl,
> +                           (int __semid, int __semnum, int __cmd,
> ...),
> +                           __semctl64);
> +# else
> +# define semctl __semctl64
> +# endif
> +#endif
> +
>  /* Get semaphore.  */
>  extern int semget (key_t __key, int __nsems, int __semflg) __THROW;
>  
> @@ -60,6 +70,17 @@ extern int semop (int __semid, struct sembuf
> *__sops, size_t __nsops) __THROW; /* Operate on semaphore with
> timeout.  */ extern int semtimedop (int __semid, struct sembuf
> *__sops, size_t __nsops, const struct timespec *__timeout) __THROW;
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (semtimedop, (int __semid, struct sembuf
> *__sops,
> +                                        size_t __nsops,
> +                                        const struct timespec
> *__timeout),
> +                           __semtimedop64);
> +#  else
> +#  define semtimedop __semtimedop64
> +#  endif
> +# endif
>  #endif
>  
>  __END_DECLS
> diff --git a/sysvipc/sys/shm.h b/sysvipc/sys/shm.h
> index 6c58742c4f..8d74911e55 100644
> --- a/sysvipc/sys/shm.h
> +++ b/sysvipc/sys/shm.h
> @@ -48,6 +48,16 @@ __BEGIN_DECLS
>  /* Shared memory control operation.  */
>  extern int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf)
> __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (shmctl,
> +                           (int __shmid, int __cmd, struct shmid_ds
> *__buf),
> +                           __shmctl64);
> +# else
> +# define shmctl __shmctl64
> +# endif
> +#endif
> +
>  /* Get shared memory segment.  */
>  extern int shmget (key_t __key, size_t __size, int __shmflg) __THROW;
>  
> diff --git a/time/sys/time.h b/time/sys/time.h
> index 21fa9ed451..d3bf1e6588 100644
> --- a/time/sys/time.h
> +++ b/time/sys/time.h
> @@ -66,6 +66,16 @@ struct timezone
>  extern int gettimeofday (struct timeval *__restrict __tv,
>  			 void *__restrict __tz) __THROW __nonnull
> ((1)); 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (gettimeofday, (struct timeval *__restrict
> __tv,
> +                                          void *__restrict __tz),
> +                           __gettimeofday64);
> +# else
> +# define gettimeofday __gettimeofday64
> +# endif
> +#endif
> +
>  #ifdef __USE_MISC
>  /* Set the current time of day and timezone information.
>     This call is restricted to the super-user.
> @@ -76,12 +86,33 @@ extern int settimeofday (const struct timeval
> *__tv, const struct timezone *__tz)
>       __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (settimeofday, (const struct timeval *__tv,
> +                                          const struct timezone
> *__tz),
> +                           __settimeofday64);
> +# else
> +# define settimeofday __settimeofday64
> +# endif
> +#endif
> +
>  /* Adjust the current time of day by the amount in DELTA.
>     If OLDDELTA is not NULL, it is filled in with the amount
>     of time adjustment remaining to be done from the last `adjtime'
> call. This call is restricted to the super-user.  */
>  extern int adjtime (const struct timeval *__delta,
>  		    struct timeval *__olddelta) __THROW;
> +
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (adjtime, (const struct timeval *__delta,
> +                                     struct timeval *__olddelta),
> +                           __adjtime64);
> +# else
> +# define adjtime __adjtime64
> +# endif
> +#endif
> +
>  #endif
>  
>  
> @@ -123,6 +154,16 @@ typedef int __itimer_which_t;
>  extern int getitimer (__itimer_which_t __which,
>  		      struct itimerval *__value) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (getitimer, (__itimer_which_t __which,
> +                                       struct itimerval *__value),
> +                           __getitimer64);
> +# else
> +# define getitimer __getitimer64
> +# endif
> +#endif
> +
>  /* Set the timer WHICH to *NEW.  If OLD is not NULL,
>     set *OLD to the old value of timer WHICH.
>     Returns 0 on success, -1 on errors.  */
> @@ -130,19 +171,59 @@ extern int setitimer (__itimer_which_t __which,
>  		      const struct itimerval *__restrict __new,
>  		      struct itimerval *__restrict __old) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (setitimer, (__itimer_which_t __which,
> +                                       const struct itimerval
> *__restrict __new,
> +                                       struct itimerval *__restrict
> __old),
> +                           __setitimer64);
> +# else
> +# define setitimer __setitimer64
> +# endif
> +#endif
> +
>  /* Change the access time of FILE to TVP[0] and the modification
> time of FILE to TVP[1].  If TVP is a null pointer, use the current
> time instead. Returns 0 on success, -1 on errors.  */
>  extern int utimes (const char *__file, const struct timeval __tvp[2])
>       __THROW __nonnull ((1));
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (utimes, (const char *__file,
> +                                    const struct timeval __tvp[2]),
> +                           __utimes64);
> +# else
> +# define utimes __utimes64
> +# endif
> +#endif
> +
>  #ifdef __USE_MISC
>  /* Same as `utimes', but does not follow symbolic links.  */
>  extern int lutimes (const char *__file, const struct timeval
> __tvp[2]) __THROW __nonnull ((1));
>  
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (lutimes, (const char *__file,
> +                                     const struct timeval __tvp[2]),
> +                           __lutimes64);
> +#  else
> +#   define lutimes __lutimes64
> +#  endif
> +# endif
> +
>  /* Same as `utimes', but takes an open file descriptor instead of a
> name.  */ extern int futimes (int __fd, const struct timeval
> __tvp[2]) __THROW; +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (futimes, (int __fd, const struct timeval
> __tvp[2]),
> +                           __futimes64);
> +#  else
> +#   define futimes __futimes64
> +#  endif
> +# endif
>  #endif
>  
>  #ifdef __USE_GNU
> @@ -151,6 +232,16 @@ extern int futimes (int __fd, const struct
> timeval __tvp[2]) __THROW; the current time instead.  Returns 0 on
> success, -1 on errors.  */ extern int futimesat (int __fd, const char
> *__file, const struct timeval __tvp[2]) __THROW;
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (futimesat, (int __fd, const char *__file,
> +                                       const struct timeval
> __tvp[2]),
> +                           __futimesat64);
> +#  else
> +#   define futimesat __futimesat64
> +#  endif
> +# endif
>  #endif
>  
>  
> diff --git a/time/time.h b/time/time.h
> index 015bc1c7f3..9a74f01b2f 100644
> --- a/time/time.h
> +++ b/time/time.h
> @@ -74,13 +74,37 @@ extern clock_t clock (void) __THROW;
>  /* Return the current time and put it in *TIMER if TIMER is not
> NULL.  */ extern time_t time (time_t *__timer) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern time_t __REDIRECT_NTH (time, (time_t *__timer), __time64);
> +# else
> +# define time __time64
> +# endif
> +#endif
> +
>  /* Return the difference between TIME1 and TIME0.  */
>  extern double difftime (time_t __time1, time_t __time0)
>       __THROW __attribute__ ((__const__));
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern double __REDIRECT_NTH (difftime, (time_t __time1, time_t
> __time0),
> +                              __difftime64);
> +# else
> +# define difftime __difftime64
> +# endif
> +#endif
> +
>  /* Return the `time_t' representation of TP and normalize TP.  */
>  extern time_t mktime (struct tm *__tp) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern time_t __REDIRECT_NTH (mktime, (struct tm *__tp), __mktime64);
> +# else
> +# define mktime __mktime64
> +# endif
> +#endif
>  
>  /* Format TP into S according to FORMAT.
>     Write no more than MAXSIZE characters and return the number
> @@ -118,6 +142,14 @@ extern char *strptime_l (const char *__restrict
> __s, in Universal Coordinated Time (aka Greenwich Mean Time).  */
>  extern struct tm *gmtime (const time_t *__timer) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern struct tm*__REDIRECT_NTH (gmtime, (const time_t *__timer),
> __gmtime64); +# else
> +# define gmtime __gmtime64
> +# endif
> +#endif
> +
>  /* Return the `struct tm' representation
>     of *TIMER in the local timezone.  */
>  extern struct tm *localtime (const time_t *__timer) __THROW;
> @@ -128,6 +160,16 @@ extern struct tm *localtime (const time_t
> *__timer) __THROW; extern struct tm *gmtime_r (const time_t
> *__restrict __timer, struct tm *__restrict __tp) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern struct tm*__REDIRECT_NTH (gmtime_r, (const time_t *__restrict
> __timer,
> +                                            struct tm *__restrict
> __tp),
> +                                 __gmtime64_r);
> +# else
> +# define gmtime_r __gmtime64_r
> +# endif
> +#endif
> +
>  /* Return the `struct tm' representation of *TIMER in local time,
>     using *TP to store the result.  */
>  extern struct tm *localtime_r (const time_t *__restrict __timer,
> @@ -141,6 +183,14 @@ extern char *asctime (const struct tm *__tp)
> __THROW; /* Equivalent to `asctime (localtime (timer))'.  */
>  extern char *ctime (const time_t *__timer) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern char *__REDIRECT_NTH (ctime, (const time_t *__timer),
> __ctime64); +# else
> +# define ctime __ctime64
> +# endif
> +#endif
> +
>  #if defined __USE_POSIX || __GLIBC_USE (ISOC2X)
>  /* Reentrant versions of the above functions.  */
>  
> @@ -152,6 +202,16 @@ extern char *asctime_r (const struct tm
> *__restrict __tp, /* Equivalent to `asctime_r (localtime_r (timer,
> *TMP*), buf)'.  */ extern char *ctime_r (const time_t *__restrict
> __timer, char *__restrict __buf) __THROW;
> +
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern char *__REDIRECT_NTH (ctime_r, (const time_t *__restrict
> __timer,
> +                                       char *__restrict __buf),
> __ctime64_r); +# else
> +# define ctime_r __ctime64_r
> +# endif
> +#endif
> +
>  #endif	/* POSIX || C2X */
>  
>  
> @@ -189,6 +249,14 @@ extern long int timezone;
>  /* Like `mktime', but for TP represents Universal Time, not local
> time.  */ extern time_t timegm (struct tm *__tp) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern time_t __REDIRECT_NTH (timegm, (struct tm *__tp), __timegm64);
> +# else
> +# define timegm __timegm64
> +# endif
> +#endif
> +
>  /* Another name for `mktime'.  */
>  extern time_t timelocal (struct tm *__tp) __THROW;
>  
> @@ -205,17 +273,54 @@ extern int dysize (int __year) __THROW
> __attribute__ ((__const__)); extern int nanosleep (const struct
> timespec *__requested_time, struct timespec *__remaining);
>  
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT)
> +extern int __REDIRECT (nanosleep, (const struct timespec
> *__requested_time,
> +                                   struct timespec *__remaining),
> +                       __nanosleep64);
> +#  else
> +#   define nanosleep __nanosleep64
> +#  endif
> +# endif
>  
>  /* Get resolution of clock CLOCK_ID.  */
>  extern int clock_getres (clockid_t __clock_id, struct timespec
> *__res) __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (clock_getres, (clockid_t __clock_id,
> +                                          struct timespec *__res),
> +                           __clock_getres64);
> +# else
> +# define clock_getres __clock_getres64
> +# endif
> +#endif
> +
>  /* Get current value of clock CLOCK_ID and store it in TP.  */
>  extern int clock_gettime (clockid_t __clock_id, struct timespec
> *__tp) __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (clock_gettime, (clockid_t __clock_id,
> struct
> +                                           timespec *__tp),
> __clock_gettime64); +# else
> +# define clock_gettime __clock_gettime64
> +# endif
> +#endif
> +
>  /* Set clock CLOCK_ID to value TP.  */
>  extern int clock_settime (clockid_t __clock_id, const struct
> timespec *__tp) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (clock_settime, (clockid_t __clock_id,
> const struct
> +                                           timespec *__tp),
> __clock_settime64); +# else
> +# define clock_settime __clock_settime64
> +# endif
> +#endif
> +
>  # ifdef __USE_XOPEN2K
>  /* High-resolution sleep with the specified clock.
>  
> @@ -225,6 +330,17 @@ extern int clock_nanosleep (clockid_t
> __clock_id, int __flags, const struct timespec *__req,
>  			    struct timespec *__rem);
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT)
> +extern int __REDIRECT (clock_nanosleep, (clockid_t __clock_id, int
> __flags,
> +                                         const struct timespec
> *__req,
> +                                         struct timespec *__rem),
> +                       __clock_nanosleep_time64);
> +# else
> +# define clock_nanosleep __clock_nanosleep_time64
> +# endif
> +#endif
> +
>  /* Return clock ID for CPU-time clock.  */
>  extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id)
> __THROW; # endif
> @@ -243,10 +359,31 @@ extern int timer_settime (timer_t __timerid,
> int __flags, const struct itimerspec *__restrict __value,
>  			  struct itimerspec *__restrict __ovalue)
> __THROW; 
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (timer_settime, (timer_t __timerid, int
> __flags,
> +     const struct itimerspec *__restrict __value,
> +     struct itimerspec *__restrict __ovalue),
> +                          __timer_settime64);
> +# else
> +# define timer_settime __timer_settime64
> +# endif
> +#endif
> +
>  /* Get current value of timer TIMERID and store it in VALUE.  */
>  extern int timer_gettime (timer_t __timerid, struct itimerspec
> *__value) __THROW;
>  
> +#ifdef __USE_TIME_BITS64
> +# if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (timer_gettime, (timer_t __timerid,
> +                                           struct itimerspec
> *__value),
> +                           __timer_gettime64) __nonnull ((1));
> +# else
> +# define timer_gettime __timer_gettime64
> +# endif
> +#endif
> +
>  /* Get expiration overrun for timer TIMERID.  */
>  extern int timer_getoverrun (timer_t __timerid) __THROW;
>  #endif
> @@ -256,6 +393,15 @@ extern int timer_getoverrun (timer_t __timerid)
> __THROW; /* Set TS to calendar time based in time base BASE.  */
>  extern int timespec_get (struct timespec *__ts, int __base)
>       __THROW __nonnull ((1));
> +
> +# ifdef __USE_TIME_BITS64
> +#  if defined(__REDIRECT_NTH)
> +extern int __REDIRECT_NTH (timespec_get, (struct timespec *__ts, int
> __base),
> +                           __timespec_get64);
> +#  else
> +#  define timespec_get __timespec_get64
> +#  endif
> +# endif
>  #endif
>  
>  




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20201229/52265143/attachment-0001.sig>


More information about the Libc-alpha mailing list