[v2,10/11] Make second argument of gettimeofday as 'void *'

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.
Related show

Commit Message

Adhemerval Zanella Oct. 25, 2019, 12:08 p.m.
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

Comments

Lukasz Majewski Oct. 28, 2019, 2:22 p.m. | #1
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

Patch

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;