MSDN says: "Do not cast a pointer to a FILETIME structure to either a
authorTor Lillqvist <tml@novell.com>
Mon, 4 Aug 2008 19:22:05 +0000 (19:22 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Mon, 4 Aug 2008 19:22:05 +0000 (19:22 +0000)
2008-08-04  Tor Lillqvist  <tml@novell.com>

* 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
glib/gmain.c

index d35392a..b422a45 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-08-04  Tor Lillqvist  <tml@novell.com>
 
+       * 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  <tml@novell.com>
+
        * glib/giowin32.c
        * glib/gmain.c
        * glib/gspawn-win32.c
index c375623..2ed2fc5 100644 (file)
@@ -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
 }