qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-2.11?] osdep.h: Make TIME_MAX handle differe


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH for-2.11?] osdep.h: Make TIME_MAX handle different time_t types
Date: Thu, 23 Nov 2017 17:00:52 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0

On 23/11/2017 16:56, Peter Maydell wrote:
> In our various supported host OSes, the time_t type may be either 32
> or 64 bit, and could in theory also be either signed or unsigned.
> Notably, in OpenBSD time_t is a 64 bit type even if 'long' is 32
> bits, so using LONG_MAX for TIME_MAX is incorrect.
> 
> Use an approach suggested by Paolo Bonzini which calculates
> the maximum value of the type rather than hardcoding it;
> to do this we use the TYPE_MAXIMUM macro from Gnulib.
> 
> Suggested-by: Paolo Bonzini <address@hidden>
> Signed-off-by: Peter Maydell <address@hidden>
> ---
>  include/qemu/osdep.h | 29 ++++++++++++++++++++++++++++-
>  1 file changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> index 281782d..e8568a0 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -147,8 +147,35 @@ extern int daemon(int, int);
>  #if !defined(ESHUTDOWN)
>  #define ESHUTDOWN 4099
>  #endif
> +
> +/* time_t may be either 32 or 64 bits depending on the host OS, and
> + * can be either signed or unsigned, so we can't just hardcode a
> + * specific maximum value. This is not a C preprocessor constant,
> + * so you can't use TIME_MAX in an #ifdef, but for our purposes
> + * this isn't a problem.
> + */
> +
> +/* The macros TYPE_SIGNED, TYPE_WIDTH, and TYPE_MAXIMUM are from
> + * Gnulib, and are under the LGPL v2.1 or (at your option) any
> + * later version.
> + */
> +
> +/* True if the real type T is signed.  */
> +#define TYPE_SIGNED(t) (!((t)0 < (t)-1))
> +
> +/* The width in bits of the integer type or expression T.
> + * Padding bits are not supported.
> + */
> +#define TYPE_WIDTH(t) (sizeof(t) * CHAR_BIT)
> +
> +/* The maximum and minimum values for the integer type T.  */
> +#define TYPE_MAXIMUM(t)                                                \
> +  ((t) (!TYPE_SIGNED(t)                                                \
> +        ? (t)-1                                                        \
> +        : ((((t)1 << (TYPE_WIDTH(t) - 2)) - 1) * 2 + 1)))
> +
>  #ifndef TIME_MAX
> -#define TIME_MAX LONG_MAX
> +#define TIME_MAX TYPE_MAXIMUM(time_t)
>  #endif
>  
>  /* HOST_LONG_BITS is the size of a native pointer in bits. */
> 

Reviewed-by: Paolo Bonzini <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]