[RFC v4 06/24] sysdeps/timespec_get: Use clock_gettime64 if avaliable
Alistair Francis
alistair23@gmail.com
Thu Aug 15 21:23:00 GMT 2019
On Thu, Aug 15, 2019 at 2:19 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> On Thu, 15 Aug 2019, Alistair Francis wrote:
>
> > There is no internal header for timespec_get, would you prefer me to
> > create one or put the define in time/time.h?
>
> time/time.h is an installed header, so it mustn't go there.
> include/time.h would be fine (it has several such defines, for
> __localtime64 etc.).
Ok, I have this in include/time.h:
#if __TIMESIZE == 64
#define timespec_get __timespec_get64
#else
and this in the c file:
/* Set TS to calendar time based in time base BASE. */
int
__timespec_get64 (struct timespec *ts, int base)
{
switch (base)
{
int res;
INTERNAL_SYSCALL_DECL (err);
case TIME_UTC:
#ifdef __ASSUME_TIME64_SYSCALLS
# ifndef __NR_clock_gettime64
# define __NR_clock_gettime64 __NR_clock_gettime
# endif
res = INTERNAL_VSYSCALL (clock_gettime64, err, 2, CLOCK_REALTIME, ts);
#else
# ifdef __NR_clock_gettime64
res = INTERNAL_VSYSCALL (clock_gettime64, err, 2, CLOCK_REALTIME, ts);
# endif /* __NR_clock_gettime64 */
struct timespec ts32;
if (! in_time_t_range (ts->tv_sec))
{
__set_errno (EOVERFLOW);
return -1;
}
valid_timespec64_to_timespec (ts, &ts32);
res = INTERNAL_VSYSCALL (clock_gettime, err, 2, CLOCK_REALTIME, &ts32);
if (res == 0 || !INTERNAL_SYSCALL_ERROR_P (res, err))
{
ts->tv_sec = ts32.tv_sec;
ts->tv_nsec = ts32.tv_nsec;
}
#endif
if (INTERNAL_SYSCALL_ERROR_P (res, err))
return 0;
break;
default:
return 0;
}
return base;
}
#if __TIMESIZE != 64
int
timespec_get (struct timespec *ts, int base)
{
struct __timespec64 ts64;
ret = __timespec_get64 (ts64, base);
if (res == 0 || !INTERNAL_SYSCALL_ERROR_P (res, err))
{
ts->tv_sec = ts64.tv_sec;
ts->tv_nsec = ts64.tv_nsec;
}
return ret;
}
#endif
Alistair
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
More information about the Libc-alpha
mailing list