Message ID | 20191025120832.27667-11-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 2f2c76e1c8d8c4431c6395afeee420b71a4d772a |
Headers | show |
Series | Y2038 preparation: use clock_[gs]ettime to implement the other time-getting and -setting functions. | expand |
On Fri, 25 Oct 2019 09:08:31 -0300 Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > From: Zack Weinberg <zackw@panix.com> > > Changes from previous version: > > - Remove warning for use of gettimeofday with a non-null __tz > argument, the conditionals of making this work without false-positive > seems quite specific and fragile (gcc-only, optimized build, > workaround for gcc bug). > > -- > > Also make the public prototype of gettimeofday declare its second > argument with type "void *" unconditionally, consistent with POSIX. > > It is also consistent with POSIX. > > Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu. > > Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > include/sys/time.h | 2 +- > .../unix/sysv/linux/aarch64/gettimeofday.c | 4 ++-- > .../unix/sysv/linux/powerpc/gettimeofday.c | 4 ++-- > sysdeps/unix/sysv/linux/x86/gettimeofday.c | 4 ++-- > time/gettimeofday.c | 4 ++-- > time/sys/time.h | 23 > ++++++++++--------- 6 files changed, 21 insertions(+), 20 deletions(-) > > diff --git a/include/sys/time.h b/include/sys/time.h > index 2bf4297e76..a461295c6a 100644 > --- a/include/sys/time.h > +++ b/include/sys/time.h > @@ -21,7 +21,7 @@ > > # ifndef _ISOMAC > extern int __gettimeofday (struct timeval *__tv, > - struct timezone *__tz); > + void *__tz); > extern int __settimezone (const struct timezone *__tz) > attribute_hidden; > extern int __adjtime (const struct timeval *__delta, > diff --git a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c > b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index > 075af3d0d3..7e772e05ce 100644 --- > a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ > b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -31,7 +31,7 @@ > /* Used as a fallback in the ifunc resolver if VDSO is not available > and for libc.so internal __gettimeofday calls. */ > static int > -__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) > +__gettimeofday_vsyscall (struct timeval *restrict tv, void *restrict > tz) { > if (__glibc_unlikely (tz != 0)) > memset (tz, 0, sizeof *tz); > @@ -50,7 +50,7 @@ libc_ifunc (__gettimeofday, > > #else > int > -__gettimeofday (struct timeval *tv, struct timezone *tz) > +__gettimeofday (struct timeval *restrict tv, void *restrict tz) > { > return __gettimeofday_vsyscall (tv, tz); > } > diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c > b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c index > 02486dee3a..18d8f7cb7a 100644 --- > a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ > b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -24,7 +24,7 @@ > #include <sysdep-vdso.h> > > static int > -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) > +__gettimeofday_syscall (struct timeval *restrict tv, void *restrict > tz) { > if (__glibc_unlikely (tz != 0)) > memset (tz, 0, sizeof *tz); > @@ -46,7 +46,7 @@ libc_ifunc (__gettimeofday, > : (void *) __gettimeofday_syscall); > #else > int > -__gettimeofday (struct timeval *tv, struct timezone *tz) > +__gettimeofday (struct timeval *restrict tv, void *restrict tz) > { > return __gettimeofday_syscall (tv, tz); > } > diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c > b/sysdeps/unix/sysv/linux/x86/gettimeofday.c index > cb20e358d8..190127d31e 100644 --- > a/sysdeps/unix/sysv/linux/x86/gettimeofday.c +++ > b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -25,7 +25,7 @@ > #include <sysdep-vdso.h> > > static int > -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) > +__gettimeofday_syscall (struct timeval *restrict tv, void *restrict > tz) { > if (__glibc_unlikely (tz != 0)) > memset (tz, 0, sizeof *tz); > @@ -45,7 +45,7 @@ libc_ifunc (__gettimeofday, > > #else > int > -__gettimeofday (struct timeval *tv, struct timezone *tz) > +__gettimeofday (struct timeval *restrict tv, void *restrict tz) > { > return __gettimeofday_syscall (tv, tz); > } > diff --git a/time/gettimeofday.c b/time/gettimeofday.c > index e8055b397d..ddaf46f481 100644 > --- a/time/gettimeofday.c > +++ b/time/gettimeofday.c > @@ -23,10 +23,10 @@ > If *TZ is not NULL, clear it. > Returns 0 on success, -1 on errors. */ > int > -___gettimeofday (struct timeval *tv, struct timezone *tz) > +___gettimeofday (struct timeval *restrict tv, void *restrict tz) > { > if (__glibc_unlikely (tz != 0)) > - memset (tz, 0, sizeof *tz); > + memset (tz, 0, sizeof (struct timezone)); > > struct timespec ts; > if (__clock_gettime (CLOCK_REALTIME, &ts)) > diff --git a/time/sys/time.h b/time/sys/time.h > index f8c946f94e..0473dae339 100644 > --- a/time/sys/time.h > +++ b/time/sys/time.h > @@ -54,23 +54,24 @@ struct timezone > int tz_minuteswest; /* Minutes west of GMT. */ > int tz_dsttime; /* Nonzero if DST is ever in > effect. */ }; > - > -typedef struct timezone *__restrict __timezone_ptr_t; > -#else > -typedef void *__restrict __timezone_ptr_t; > #endif > > -/* Get the current time of day and timezone information, > - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. > - Returns 0 on success, -1 on errors. > - NOTE: This form of timezone information is obsolete. > - Use the functions and variables declared in <time.h> instead. */ > +/* Get the current time of day, putting it into *TV. > + If TZ is not null, *TZ must be a struct timezone, and both fields > + will be set to zero. > + Calling this function with a non-null TZ is obsolete; > + use localtime etc. instead. > + This function itself is semi-obsolete; > + most callers should use time or clock_gettime instead. */ > extern int gettimeofday (struct timeval *__restrict __tv, > - __timezone_ptr_t __tz) __THROW __nonnull > ((1)); > + void *__restrict __tz) __THROW __nonnull > ((1)); > #ifdef __USE_MISC > /* Set the current time of day and timezone information. > - This call is restricted to the super-user. */ > + This call is restricted to the super-user. > + Setting the timezone in this way is obsolete, but we don't yet > + warn about it because it still has some uses for which there is > + no alternative. */ > extern int settimeofday (const struct timeval *__tv, > const struct timezone *__tz) > __THROW; Reviewed-by: Lukasz Majewski <lukma@denx.de> 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
diff --git a/include/sys/time.h b/include/sys/time.h index 2bf4297e76..a461295c6a 100644 --- a/include/sys/time.h +++ b/include/sys/time.h @@ -21,7 +21,7 @@ # ifndef _ISOMAC extern int __gettimeofday (struct timeval *__tv, - struct timezone *__tz); + void *__tz); extern int __settimezone (const struct timezone *__tz) attribute_hidden; extern int __adjtime (const struct timeval *__delta, diff --git a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index 075af3d0d3..7e772e05ce 100644 --- a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -31,7 +31,7 @@ /* Used as a fallback in the ifunc resolver if VDSO is not available and for libc.so internal __gettimeofday calls. */ static int -__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) +__gettimeofday_vsyscall (struct timeval *restrict tv, void *restrict tz) { if (__glibc_unlikely (tz != 0)) memset (tz, 0, sizeof *tz); @@ -50,7 +50,7 @@ libc_ifunc (__gettimeofday, #else int -__gettimeofday (struct timeval *tv, struct timezone *tz) +__gettimeofday (struct timeval *restrict tv, void *restrict tz) { return __gettimeofday_vsyscall (tv, tz); } diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c index 02486dee3a..18d8f7cb7a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -24,7 +24,7 @@ #include <sysdep-vdso.h> static int -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) +__gettimeofday_syscall (struct timeval *restrict tv, void *restrict tz) { if (__glibc_unlikely (tz != 0)) memset (tz, 0, sizeof *tz); @@ -46,7 +46,7 @@ libc_ifunc (__gettimeofday, : (void *) __gettimeofday_syscall); #else int -__gettimeofday (struct timeval *tv, struct timezone *tz) +__gettimeofday (struct timeval *restrict tv, void *restrict tz) { return __gettimeofday_syscall (tv, tz); } diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c index cb20e358d8..190127d31e 100644 --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -25,7 +25,7 @@ #include <sysdep-vdso.h> static int -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) +__gettimeofday_syscall (struct timeval *restrict tv, void *restrict tz) { if (__glibc_unlikely (tz != 0)) memset (tz, 0, sizeof *tz); @@ -45,7 +45,7 @@ libc_ifunc (__gettimeofday, #else int -__gettimeofday (struct timeval *tv, struct timezone *tz) +__gettimeofday (struct timeval *restrict tv, void *restrict tz) { return __gettimeofday_syscall (tv, tz); } diff --git a/time/gettimeofday.c b/time/gettimeofday.c index e8055b397d..ddaf46f481 100644 --- a/time/gettimeofday.c +++ b/time/gettimeofday.c @@ -23,10 +23,10 @@ If *TZ is not NULL, clear it. Returns 0 on success, -1 on errors. */ int -___gettimeofday (struct timeval *tv, struct timezone *tz) +___gettimeofday (struct timeval *restrict tv, void *restrict tz) { if (__glibc_unlikely (tz != 0)) - memset (tz, 0, sizeof *tz); + memset (tz, 0, sizeof (struct timezone)); struct timespec ts; if (__clock_gettime (CLOCK_REALTIME, &ts)) diff --git a/time/sys/time.h b/time/sys/time.h index f8c946f94e..0473dae339 100644 --- a/time/sys/time.h +++ b/time/sys/time.h @@ -54,23 +54,24 @@ struct timezone int tz_minuteswest; /* Minutes west of GMT. */ int tz_dsttime; /* Nonzero if DST is ever in effect. */ }; - -typedef struct timezone *__restrict __timezone_ptr_t; -#else -typedef void *__restrict __timezone_ptr_t; #endif -/* Get the current time of day and timezone information, - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. - Returns 0 on success, -1 on errors. - NOTE: This form of timezone information is obsolete. - Use the functions and variables declared in <time.h> instead. */ +/* Get the current time of day, putting it into *TV. + If TZ is not null, *TZ must be a struct timezone, and both fields + will be set to zero. + Calling this function with a non-null TZ is obsolete; + use localtime etc. instead. + This function itself is semi-obsolete; + most callers should use time or clock_gettime instead. */ extern int gettimeofday (struct timeval *__restrict __tv, - __timezone_ptr_t __tz) __THROW __nonnull ((1)); + void *__restrict __tz) __THROW __nonnull ((1)); #ifdef __USE_MISC /* Set the current time of day and timezone information. - This call is restricted to the super-user. */ + This call is restricted to the super-user. + Setting the timezone in this way is obsolete, but we don't yet + warn about it because it still has some uses for which there is + no alternative. */ extern int settimeofday (const struct timeval *__tv, const struct timezone *__tz) __THROW;
From: Zack Weinberg <zackw@panix.com> Changes from previous version: - Remove warning for use of gettimeofday with a non-null __tz argument, the conditionals of making this work without false-positive seems quite specific and fragile (gcc-only, optimized build, workaround for gcc bug). -- Also make the public prototype of gettimeofday declare its second argument with type "void *" unconditionally, consistent with POSIX. It is also consistent with POSIX. Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu. Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> --- include/sys/time.h | 2 +- .../unix/sysv/linux/aarch64/gettimeofday.c | 4 ++-- .../unix/sysv/linux/powerpc/gettimeofday.c | 4 ++-- sysdeps/unix/sysv/linux/x86/gettimeofday.c | 4 ++-- time/gettimeofday.c | 4 ++-- time/sys/time.h | 23 ++++++++++--------- 6 files changed, 21 insertions(+), 20 deletions(-) -- 2.17.1