On Sat, Sep 22, 2012 at 8:26 PM, Stefan Weil <s...@weilnetz.de> 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.
For now, but nothing shows that there is a problem. Adding a few simple locks shouldn't be difficult, or FIXME/XXX comment otherwise. > > Signed-off-by: Stefan Weil <s...@weilnetz.de> > --- > 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 > >