From c9211d68fc38f7114ffd6e5999f1a9ce08738d9a Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Mon, 4 Aug 2008 19:22:05 +0000 Subject: [PATCH] MSDN says: "Do not cast a pointer to a FILETIME structure to either a 2008-08-04 Tor Lillqvist * glib/gmain.c (g_get_current_time): MSDN says: "Do not cast a pointer to a FILETIME structure to either a LARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows." So don't do that then. Indeed the code did work randomly on Win64 when compiled with optimisation. svn path=/trunk/; revision=7308 --- ChangeLog | 8 ++++++++ glib/gmain.c | 11 ++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index d35392aee..b422a4577 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-08-04 Tor Lillqvist + + * glib/gmain.c (g_get_current_time): MSDN says: "Do not cast a + pointer to a FILETIME structure to either a LARGE_INTEGER* or + __int64* value because it can cause alignment faults on 64-bit + Windows." So don't do that then. Indeed the code did work randomly + on Win64 when compiled with optimisation. + 2008-08-04 Tor Lillqvist * glib/giowin32.c diff --git a/glib/gmain.c b/glib/gmain.c index c37562329..2ed2fc5c2 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -1717,20 +1717,21 @@ g_get_current_time (GTimeVal *result) result->tv_usec = r.tv_usec; #else FILETIME ft; - guint64 *time64 = (guint64 *) &ft; + guint64 time64; g_return_if_fail (result != NULL); GetSystemTimeAsFileTime (&ft); + memmove (&time64, &ft, sizeof (FILETIME)); /* Convert from 100s of nanoseconds since 1601-01-01 * to Unix epoch. Yes, this is Y2038 unsafe. */ - *time64 -= G_GINT64_CONSTANT (116444736000000000); - *time64 /= 10; + time64 -= G_GINT64_CONSTANT (116444736000000000); + time64 /= 10; - result->tv_sec = *time64 / 1000000; - result->tv_usec = *time64 % 1000000; + result->tv_sec = time64 / 1000000; + result->tv_usec = time64 % 1000000; #endif }