From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>, Stefan Weil <sw@weilnetz.de>
Subject: [Qemu-devel] [PATCH for-2.4] oslib-win32: only provide localtime_r/gmtime_r if missing
Date: Fri, 31 Jul 2015 11:17:56 +0100 [thread overview]
Message-ID: <1438337876-13558-1-git-send-email-berrange@redhat.com> (raw)
The oslib-win32 file currently provides a localtime_r and
gmtime_r replacement unconditionally. Some versions of
Mingw64 would provide crude macros for localtime_r/gmtime_r
which QEMU takes care to disable. Latest versions of Mingw64
now provide actual functions for localtime_r/gmtime_r, but
with a twist that you have to include unistd.h or pthread.h
before including time.h. By luck some files in QEMU have
such an include order, resulting in compile errors:
CC util/osdep.o
In file included from include/qemu-common.h:48:0,
from util/osdep.c:48:
include/sysemu/os-win32.h:77:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
struct tm *gmtime_r(const time_t *timep, struct tm *result);
^
In file included from include/qemu-common.h:35:0,
from util/osdep.c:48:
/usr/i686-w64-mingw32/sys-root/mingw/include/time.h:272:107: note: previous definition of 'gmtime_r' was here
In file included from include/qemu-common.h:48:0,
from util/osdep.c:48:
include/sysemu/os-win32.h:79:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
struct tm *localtime_r(const time_t *timep, struct tm *result);
^
In file included from include/qemu-common.h:35:0,
from util/osdep.c:48:
/usr/i686-w64-mingw32/sys-root/mingw/include/time.h:269:107: note: previous definition of 'localtime_r' was here
This change adds a configure test to see if localtime_r
exits, and only enables the QEMU impl if missing. We also
re-arrange qemu-common.h try attempt to guarantee that all
source files get unistd.h before time.h and thus see the
localtime_r/gmtime_r defs.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
configure | 34 ++++++++++++++++++++++++++++++++++
include/qemu-common.h | 4 +++-
include/sysemu/os-win32.h | 2 ++
util/oslib-win32.c | 2 ++
4 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/configure b/configure
index 704b34c..322f97b 100755
--- a/configure
+++ b/configure
@@ -1726,6 +1726,37 @@ else
fi
##########################################
+# Mingw64 localtime_r/gmtime_r check
+
+if test "$mingw32" = "yes"; then
+ # Some versions of Mingw32/64 lack localtime_r
+ # and gmtime_r entirely
+ #
+ # Some versions of Mingw64 define a macro for
+ # localtime_r/gmtime_r/etc
+ #
+ # Some versions of Ming64 will define functions
+ # for localtime_r/gmtime_r, but only if you have
+ # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
+ # though, unistd.h and pthread.h both define
+ # that for you.
+ #
+ # So this #undef localtime_r and #include <unistd.h>
+ # are not in fact redundant
+cat > $TMPC << EOF
+#include <unistd.h>
+#include <time.h>
+#undef localtime_r
+int main(void) { localtime_r(NULL, NULL); return 0; }
+EOF
+ if compile_prog "" "" ; then
+ localtime_r="yes"
+ else
+ localtime_r="no"
+ fi
+fi
+
+##########################################
# pkg-config probe
if ! has "$pkg_config_exe"; then
@@ -4993,6 +5024,9 @@ fi
if test "$zero_malloc" = "yes" ; then
echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak
fi
+if test "$localtime_r" = "yes" ; then
+ echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
+fi
if test "$qom_cast_debug" = "yes" ; then
echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
fi
diff --git a/include/qemu-common.h b/include/qemu-common.h
index fb3da6c..e9e3f59 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -32,10 +32,12 @@
#include <strings.h>
#include <inttypes.h>
#include <limits.h>
+/* Put unistd.h before time.h as that triggers localtime_r/gmtime_r
+ * function availability on recentish Mingw64 platforms */
+#include <unistd.h>
#include <time.h>
#include <ctype.h>
#include <errno.h>
-#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/time.h>
diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
index 4035c4f..ba65a25 100644
--- a/include/sysemu/os-win32.h
+++ b/include/sysemu/os-win32.h
@@ -73,10 +73,12 @@
#define siglongjmp(env, val) longjmp(env, val)
/* Missing POSIX functions. Don't use MinGW-w64 macros. */
+#ifndef CONFIG_LOCALTIME_R
#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);
+#endif /* CONFIG_LOCALTIME_R */
static inline void os_setup_signal_handling(void) {}
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index 730a670..08f5a9c 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -95,6 +95,7 @@ void qemu_anon_ram_free(void *ptr, size_t size)
}
}
+#ifndef CONFIG_LOCALTIME_R
/* FIXME: add proper locking */
struct tm *gmtime_r(const time_t *timep, struct tm *result)
{
@@ -118,6 +119,7 @@ struct tm *localtime_r(const time_t *timep, struct tm *result)
}
return p;
}
+#endif /* CONFIG_LOCALTIME_R */
void qemu_set_block(int fd)
{
--
2.4.3
next reply other threads:[~2015-07-31 10:18 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-31 10:17 Daniel P. Berrange [this message]
2015-07-31 12:49 ` [Qemu-devel] [PATCH for-2.4] oslib-win32: only provide localtime_r/gmtime_r if missing Paolo Bonzini
2015-07-31 13:33 ` Daniel P. Berrange
2015-07-31 17:58 ` Stefan Weil
2015-08-05 9:52 ` Daniel P. Berrange
2015-08-05 11:03 ` [Qemu-devel] QEMU 2.4 for Windows - current status Stefan Weil
2015-08-05 12:49 ` Paolo Bonzini
2015-08-05 15:38 ` Stefan Weil
2015-09-10 20:38 ` Stefan Weil
2015-08-05 16:51 ` Liviu Ionescu
2015-08-05 16:56 ` Paolo Bonzini
2015-08-05 18:39 ` Liviu Ionescu
2015-08-05 20:30 ` Stefan Weil
2015-08-05 21:42 ` Liviu Ionescu
2015-08-06 8:44 ` Kevin Wolf
2015-08-06 10:12 ` Stefan Weil
2015-08-06 17:12 ` Richard Henderson
2015-08-10 10:25 ` Peter Maydell
2015-08-10 11:39 ` Stefan Weil
2015-08-10 14:00 ` Paolo Bonzini
2015-08-10 20:22 ` Stefan Weil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1438337876-13558-1-git-send-email-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sw@weilnetz.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.