+2006-04-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gatomic.c: Adapt to the changed prototype of
+ InterlockedCompareExchange() in newer SDKs. Use
+ InterlockedCompareExchangePointer() when applicable. (#155884,
+ John Ehresman)
+
2006-04-18 Matthias Clasen <mclasen@redhat.com>
* glib/gkeyfile.h:
+2006-04-19 Tor Lillqvist <tml@novell.com>
+
+ * glib/gatomic.c: Adapt to the changed prototype of
+ InterlockedCompareExchange() in newer SDKs. Use
+ InterlockedCompareExchangePointer() when applicable. (#155884,
+ John Ehresman)
+
2006-04-18 Matthias Clasen <mclasen@redhat.com>
* glib/gkeyfile.h:
#ifdef DEFINE_WITH_WIN32_INTERLOCKED
# include <windows.h>
-gint32
+/* Following indicates that InterlockedCompareExchangePointer is
+ * declared in winbase.h (included by windows.h) and needs to be
+ * commented out if not true. It is defined iff WINVER > 0x0400,
+ * which is usually correct but can be wrong if WINVER is set before
+ * windows.h is included.
+ */
+# if WINVER > 0x0400
+# define HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
+# endif
+
+gint32
g_atomic_int_exchange_and_add (volatile gint32 *atomic,
gint32 val)
{
gint32 oldval,
gint32 newval)
{
+#ifndef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
return (guint32) InterlockedCompareExchange ((PVOID*)atomic,
(PVOID)newval,
(PVOID)oldval) == oldval;
+#else
+ return InterlockedCompareExchange (atomic,
+ newval,
+ oldval) == oldval;
+#endif
}
gboolean
gpointer oldval,
gpointer newval)
{
-# if GLIB_SIZEOF_VOID_P != 4 /* no 32-bit system */
-# error "InterlockedCompareExchangePointer needed"
+# ifdef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER
+ return InterlockedCompareExchangePointer (atomic, newval, oldval) == oldval;
# else
+# if GLIB_SIZEOF_VOID_P != 4 /* no 32-bit system */
+# error "InterlockedCompareExchangePointer needed"
+# else
return InterlockedCompareExchange (atomic, newval, oldval) == oldval;
+# endif
# endif
}
#endif /* DEFINE_WITH_WIN32_INTERLOCKED */