[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] w32: Add implementation of gmtime_r, localtime_
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH] w32: Add implementation of gmtime_r, localtime_r |
Date: |
Sun, 23 Sep 2012 17:10:35 +0000 |
On Sat, Sep 22, 2012 at 8:26 PM, Stefan Weil <address@hidden> wrote:
> Those functions are missing in MinGW.
>
> Some versions of MinGW-w64 include defines for gmtime_r and localtime_r.
> Older versions of these macros are buggy (they return a pointer to a
> static variable), therefore we don't want them. Newer versions are
> similar to the code used here, but without the memset.
>
> The implementation which is used here is not strictly reentrant,
> but sufficiently good for QEMU on w32 or w64.
>
> Signed-off-by: Stefan Weil <address@hidden>
Thanks, applied with comment.
> ---
> oslib-win32.c | 22 ++++++++++++++++++++++
> qemu-os-win32.h | 6 ++++++
> 2 files changed, 28 insertions(+)
>
> diff --git a/oslib-win32.c b/oslib-win32.c
> index ffbc6d0..2acbf9b 100644
> --- a/oslib-win32.c
> +++ b/oslib-win32.c
> @@ -74,6 +74,28 @@ void qemu_vfree(void *ptr)
> VirtualFree(ptr, 0, MEM_RELEASE);
> }
>
> +struct tm *gmtime_r(const time_t *timep, struct tm *result)
> +{
> + struct tm *p = gmtime(timep);
> + memset(result, 0, sizeof(*result));
> + if (p) {
> + *result = *p;
> + p = result;
> + }
> + return p;
> +}
> +
> +struct tm *localtime_r(const time_t *timep, struct tm *result)
> +{
> + struct tm *p = localtime(timep);
> + memset(result, 0, sizeof(*result));
> + if (p) {
> + *result = *p;
> + p = result;
> + }
> + return p;
> +}
> +
> void socket_set_block(int fd)
> {
> unsigned long opt = 0;
> diff --git a/qemu-os-win32.h b/qemu-os-win32.h
> index 753679b..3b5a35b 100644
> --- a/qemu-os-win32.h
> +++ b/qemu-os-win32.h
> @@ -68,6 +68,12 @@
> /* Declaration of ffs() is missing in MinGW's strings.h. */
> int ffs(int i);
>
> +/* Missing POSIX functions. Don't use MinGW-w64 macros. */
> +#undef gmtime_r
> +struct tm *gmtime_r(const time_t *timep, struct tm *result);
> +#undef localtime_r
> +struct tm *localtime_r(const time_t *timep, struct tm *result);
> +
> static inline void os_setup_signal_handling(void) {}
> static inline void os_daemonize(void) {}
> static inline void os_setup_post(void) {}
> --
> 1.7.10
>
>