This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v10] y2038: Provide conversion helpers for struct __timespec64


On Mon, Sep 30, 2019 at 03:31:34PM +0200, Lukasz Majewski wrote:
> Those functions allow easy conversion between Y2038 safe struct
> __timespec64 and other time related data structures (like struct timeval
> or struct timespec).
> 
> * include/time.h (valid_timeval_to_timespec64): Add.
> * include/time.h (valid_timespec_to_timespec64): Likewise.
> * include/time.h (valid_timespec64_to_timespec): Likewise.
> * include/time.h (valid_timespec64_to_timeval): Likewise.
> 
> ---
> Changes for v10:
> - Provide only conversion functions to work on "valid" time structures
>   (no need to provide any excessive checks)
> - Return values instead of pointers
> 
> Changes for v9:
> - Update comments to be more concise and describe return values from
>   conversion functions (according to Joseph's request).
> 
> Changes for v8:
> - None
> 
> Changes for v7:
> - None
> 
> Changes for v6:
> - Remove the #ifdef guard on __ASSUME_TIME64_SYSCALLS as those functions
>   may be needed for fallback execution paths (on e.g. __clock_settime64).
> 
> Changes for v5:
> - This code is now only compiled in when __ASSUME_TIME64_SYSCALLS is NOT
>   defined. Previously it was depending on #if __TIMESIZE != 64.
> 
> Changes for v4:
> - None
> 
> Changes for v3:
> - Remove misleading comments regarding clearing tv_pad values during
>   conversion (as Linux kernel on its own ignores upper 32 bits of tv_nsec).
> 
> Changes for v3:
> - Remove timespec64_clear_padding function - as kernel ignores upper 32
>   bits of tv_nsec when passed via syscall to the Linux kernel
> 
> Changes for v2:
> - Add timespec64_clear_padding function
> ---
>  include/time.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/include/time.h b/include/time.h
> index 9727786634..9878c2b2ca 100644
> --- a/include/time.h
> +++ b/include/time.h
> @@ -178,5 +178,54 @@ in_time_t_range (__time64_t t)
>    return s == t;
>  }
>  
> +/* Convert a known valid struct timeval into a struct __timespec64.  */
> +static inline struct __timespec64
> +valid_timeval_to_timespec64 (const struct timeval tv)
> +{
> +  struct __timespec64 ts64;
> +
> +  ts64.tv_sec = tv.tv_sec;
> +  ts64.tv_nsec = tv.tv_usec * 1000;
> +
> +  return ts64;
> +}
> +
> +/* Convert a known valid struct timespec into a struct __timespec64.  */
> +static inline struct __timespec64
> +valid_timespec_to_timespec64 (const struct timespec ts)
> +{
> +  struct __timespec64 ts64;
> +
> +  ts64.tv_sec = ts.tv_sec;
> +  ts64.tv_nsec = ts.tv_nsec;
> +
> +  return ts64;
> +}
> +
> +/* Convert a valid and within range of struct timespec, struct
> +   __timespec64 into a struct timespec.  */
> +static inline struct timespec
> +valid_timespec64_to_timespec (const struct __timespec64 ts64)
> +{
> +  struct timespec ts;
> +
> +  ts.tv_sec = (time_t) ts64.tv_sec;
> +  ts.tv_nsec = ts64.tv_nsec;
> +
> +  return ts;
> +}
> +
> +/* Convert a valid and within range of struct timeval struct
> +   __timespec64 into a struct timeval.  */
> +static inline struct timeval
> +valid_timespec64_to_timeval (const struct __timespec64 ts64)
> +{
> +  struct timeval tv;
> +
> +  tv.tv_sec = (time_t) ts64.tv_sec;
> +  tv.tv_usec = ts64.tv_nsec / 1000;
> +
> +  return tv;
> +}
>  #endif
>  #endif

Unfortunately, this didn't work out as intended because Linux kernel prior
to commit 7b8474466ed97be458c825f34a85f2c2b84c3f95 (including released
version v5.4) did not zero the upper 32-bits of tv_nsec on 32-bit
architectures, which means that we have to do it in
valid_timeval_to_timespec64 and valid_timespec_to_timespec64 instead.


-- 
ldv

Attachment: signature.asc
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]